【发布时间】: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()方法的东西。)请注意,async和await只不过是 Promises 的语法糖。
标签: javascript arrays typescript async-await promise