代码在await
上变成异步 - 我们不知道要返回什么
await
除了等待Promise解析之外,还会立即将代码执行返回给调用者。 await
后面的所有代码都是异步的。
async
是返回Promise的语法糖。
- 如果您不想在
await
处返回Promise,在异步代码中有什么合理的替代方法?
让我们看一下以下错误代码以查看返回值问题:
function f() {
let result = await myPromise;
return "function finished";
}
我们可以提出另一个问题:为什么没有同步版本的 await
,而不需要将代码更改为异步?
我认为原因有很多,良好的设计是使异步代码变成同步代码变得困难。例如,这将使人们在等待异步函数返回时意外地让整个应用程序冻结。
为了进一步说明 async
和 await
的运行时顺序:
async function f() {
for(var i = 0; i < 1000000; i++);
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("done!"), 1000)
});
console.log("message inside f before returning, still synchronous, i = " + i);
let result = await promise;
console.log("message inside f after await, asynchronous now");
console.log(result);
return "function finished";
}
let myresult = f();
console.log("message outside f, immediately after calling f");
控制台日志输出为:
message inside f before returning, still synchronous, i = 1000000
message message outside f, immediately after calling f
message inside f after await, asynchronous now
done!
f()
返回result
时会发生什么?调用函数将立即获得返回值——它不知道你在f()
中使用了await
。使用异步函数时,返回值将是一个 Promise。 - Mark