javascript - 使用条件语句和 IIAEF 等待/异步
问题描述
描述
我想有条件地SELECT
在非异步函数中调用一个数据库。我把它包成IIAEF?
这样
async function getScopedDataPolicies() {
const test = new Promise((res) => {
console.log('2')
res('test1')
})
return test;
}
function nonAsyncMethod() {
(async () => {
console.log('1')
const test = getScopedDataPolicies();
const policies = await test;
console.log('3')
})()
console.log('4')
}
nonAsyncMethod()
我的期望是
1
2
3
4
但我明白了
1
2
4
3
await
立即调用方法中的工作不会是什么?
看看这些例子;我错过了什么吗? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/async_function
解决方案
所做await
的只是暂停当前函数的执行,直到异步任务完成,此时执行将继续。它不会暂停所有的 Javascript,这种行为是同步编程,而 Javascript 是为了避免这种情况而构建的,因为如果每次发出休息请求时 Javascript 都必须停止,这会导致非常糟糕的用户体验等。
更新
一些可能的解决方法:
- 等待 IIFE,或完全取出 IIFE。IIFE 是一个异步函数,因此它会在调用时返回一个 Promise。您没有等待该承诺,这就是为什么您的外部同步功能会继续运行而不等待它完成的原因。
async function nonAsyncMethod() {
await (async () => {
console.log('1')
const test = getScopedDataPolicies();
const policies = await test;
console.log('3')
})()
console.log('4')
}
console.log('4')
搬进您的 IIFE 。我知道这console.log('4')
可能代表整个代码日志,但在某些情况下,您只需将其全部移动到内部 - 如果必须将您的函数分解为更小的函数。
推荐阅读
- java - 从 FreeMarker 中的模板字符串中获取所有依赖项名称的列表(甚至是多级继承)
- oracle - 使用 utl_file 将任何表提取到 excel 文件
- html - 是否可以让元素的旋转速度比它在 CSS 中的翻译速度慢?
- r - 如何使用 for 循环更改 R 中的连续值?
- python - 在 Django 的 LiveServerTestCase 中使用 python-requests 失败,出现 502
- components - 从 CSHTML 设置的 Blazor 组件 EventCallback
- firebase - Firebase 中的日志记录支持
- ruby-on-rails - 将环境升级到 Ruby 3.0.1 后,我的应用程序继续使用 2.6.3
- reactjs - (React) useDispatch TypeError: Object(...) is not a function handleChange
- mysql - 通过 querybuilder 在 typeorm 中批量更新查询