gpt4 book ai didi

javascript - 异步等待函数的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 09:27:14 24 4
gpt4 key购买 nike

我有以下异步代码示例:

// Functions

function getSomePromise() {
let a = new Promise((resolve, reject) => {
setTimeout(function(){
console.log("Inside promise...");
resolve("Success!");
}, 1000);
});

return a;
}

async function someWrapper(i) {
console.log('A: '+ i);
await getSomePromise();
console.log('B: ' + i);
}

还有两个测试:

async function test1() {
for(let i=0; i<5; i++) {
// body copy-pasted of someWrapper function:
console.log('A: '+ i);
await getSomePromise();
console.log('B: ' + i);
}
}

async function test2() {
for(let i=0; i<5; i++) {
someWrapper(i);
}
}

下面是分别运行 test1()test2() 后 chrome 控制台中的结果:

Test 1               |      Test 2
---------------------------------------------
A: 0 | A: 0
Inside promise... | A: 1
B: 0 | A: 2
A: 1 | A: 3
Inside promise... | A: 4
B: 1 | Inside promise...
A: 2 | B: 0
Inside promise... | Inside promise...
B: 2 | B: 1
A: 3 | Inside promise...
Inside promise... | B: 2
B: 3 | Inside promise...
A: 4 | B: 3
Inside promise... | Inside promise...
B: 4 | B: 4

问题:为什么当我们在for-loop (test2) 中使用函数someWrapper() 时,我们得到的结果与我们复制的结果不同-将此函数体直接粘贴到 for-loop (test1) 中?

(上面的示例非常抽象,但是“我发现了这种行为”是在调用 ajax 请求时(而不是 console.log('A: '+ i);console.log( 'B: '+ i);) 在我的应用程序中哪个序列非常重要(请求 A1 必须在请求 B0 之前...))

最佳答案

看评论

@HMR - hm... I not understand - in question example there is async function someWrapper() but that function don't return anything (it even doesn't have return statement (!) ) - can you explain what do you mean by async functions immediately return a promise? - Kamil Kielczewski

看来你不明白async await。我通常建议人们在理解 promise 之前停止等待。然而,在下一个问题的评论中,我给你答案:

someWrapper will immediately return a promise that resolves to undefined. The await only "waits" in the someWrapper function but the function calling someWrapper will immediately receive a promise that resolves in undefined. Functions always return something, if you don't in code then it will return undefined. If it's an async function without a return then it'll return a promise that resolves in undefined - HMR.

Await 是 promises 的语法糖(更好看的代码),实际上并不等待任何东西。

也许下面的代码可以解决问题:

var test = async () => {
await 22;//doesn't even matter if value is promise
console.log("after wait");
}
var result = test();
console.log("outside test we don't wait for anything",result);

如果您不明白为什么该代码的输出是:

outside test we don't wait for anything Promise {< pending >}

after wait

然后我建议您只使用 promises,直到您这样做为止。

关于javascript - 异步等待函数的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48670283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com