【问题标题】:For Loop with a function call doesn't seem to be waiting for await inside the function带有函数调用的 For Loop 似乎没有在函数内部等待 await
【发布时间】:2022-12-01 16:37:28
【问题描述】:

对不起,令人困惑的标题。 所以我基本上拥有的是一个带有 for 循环的函数,在循环中调用另一个函数,该函数内部有一个带有“await”的调用。 async/await 调用完成后,内部函数将值推送到数组中。循环完成后返回数组的值。

像这样:


let globalArray = [];

const innerFunction = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(1);
    }, 100);
  });
};

const callingFunction = async () => {
  let a = await innerFunction();
  globalArray.push(a);
  console.log(`GLOBAL ARRAY AFTER PUSH IN THE CALLING FUCNTION`);
  console.log(globalArray);
};


const outerFunction = () => {
  for (let i = 0; i < 1; i++) {
    callingFunction();
    console.log(`GLOBAL ARRAY AFTER FUCTION CALL`);
    console.log(globalArray);
  }
  console.log(`GLOBAL ARRAY AFTER FOR LOOP END ${globalArray}`);
  console.log(globalArray);
};

我观察到的是 globalArray 的值在 for 循环内部和之后的日志中都没有变化(将 globalArray 记录为 []),但是 callingFunction 中的日志就在 @987654328 之后@ 语句似乎将 globalArray 记录为 [1]

这表明 await 语句没有被 for 循环中的主函数调用等待。

理想情况下,我希望所有日志语句都将 globalArray 记录为 [1]

为什么会这样?有一个更好的方法吗?我无法改变调用模式本身,因为在我的实际实现中,每个函数都有额外的事情要做。

我已将此实现放在此处的 stackblitz 上:https://stackblitz.com/edit/typescript-i8jusx?file=index.ts

【问题讨论】:

  • 如果你await它,你的代码只会等待async函数完成。你不是在等待callingFunction()所以它不会等待。
  • @Ivar 啊,好的。那么,将另一个 Promise 从 callingFunction() 返回到 outerFunction() 是一个好习惯吗?
  • 它已经做到了。 async 函数隐式返回一个 Promise。而你只能await承诺。 (好吧,从技术上讲,任何具有 .then() 方法的东西。)请注意,asyncawait 只不过是 Promises 的语法糖。

标签: javascript arrays typescript async-await promise


【解决方案1】:

调用 callingFunction 时,您在 outerFunction 中缺少 await 关键字。

const outerFunction = async () => {
  for (let i = 0; i < 1; i++) {
    await callingFunction();
    console.log(`GLOBAL ARRAY AFTER FUCTION CALL`);
    console.log(globalArray);
  }
  console.log(`GLOBAL ARRAY AFTER FOR LOOP END ${globalArray}`);
  console.log(globalArray);
};

请记住,async 函数会自动返回 Promise,即使它是 Promise&lt;void&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    相关资源
    最近更新 更多