首页 > 解决方案 > 使用条件语句和 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

标签: javascriptasync-await

解决方案


所做await的只是暂停当前函数的执行,直到异步任务完成,此时执行将继续。它不会暂停所有的 Javascript,这种行为是同步编程,而 Javascript 是为了避免这种情况而构建的,因为如果每次发出休息请求时 Javascript 都必须停止,这会导致非常糟糕的用户体验等。

更新

一些可能的解决方法:

  1. 等待 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')
}
  1. console.log('4')搬进您的 IIFE 。我知道这console.log('4')可能代表整个代码日志,但在某些情况下,您只需将其全部移动到内部 - 如果必须将您的函数分解为更小的函数。

推荐阅读