【发布时间】:2017-12-13 14:54:37
【问题描述】:
我已尝试阅读异步/等待的指南和教程,但我似乎无法在任何地方找到此问题。
这里是有问题的代码:
var func1 = new Promise((resolve, reject) => {
console.log("Func1");
setTimeout(() => {
resolve(10);
}, 100);
});
var func2 = new Promise((resolve, reject) => {
console.log("Func2");
setTimeout(() => {
resolve(20);
}, 5000);
})
let run = async() => {
let var1 = await func1;
let var2 = await func2;
console.log(var1);
console.log(var2);
}
run();
我们看到“Func1”和“Func2”被立即打印,一个接一个。 5 秒后,在 func2 中指定的超时,我们打印出“10”和“20”。到目前为止一切顺利。
但是如果我把最后一段代码改成这样:
let run = async() => {
let var1 = await func1;
console.log(var1);
let var2 = await func2;
console.log(var2);
}
然后我看到“Func1”立即打印出来,但“Func2”也打印出来了,尽管 console.log(var1) 出现在它之前。 100ms 后出现“10”,5 秒后出现“20”。
来自 MDN:
await 表达式会导致异步函数执行暂停,直到 Promise 被履行或拒绝,并在履行后恢复异步函数的执行。
但这似乎不是正在发生的事情。如果是,我们不会看到“Func1”,然后是“10”,然后 func2 被执行,因此打印“Func2”,5 秒后我们得到“20”? func1 应该被执行,一旦它被解决(在 100 毫秒内),console.log(var1) 应该被触发。我在这里错过了什么?
【问题讨论】:
-
它在你创建它时开始解析,而不是在你等待它时
标签: javascript asynchronous async-await