Jer*_*oen -1 javascript node.js async-await es6-promise
我一直在阅读 Node.js 中的 async/await。我了解到await关键字等待承诺得到解决,或者如果被拒绝则抛出异常。
我还了解到,每个想要使用的功能都await需要标记async。但是,函数被标记为 async 意味着什么?
我能找到的所有资源和博客文章似乎都await非常详细地解释了,但忽略了函数的概念async,或者简单地掩盖了它。例如,笔者是这样表述的:
这使得函数隐式返回一个 Promise。
async关键字的真正作用是什么?函数隐式返回 Promise 意味着什么?除了可以使用之外还有什么副作用await?
好吧,从我迄今为止收到的答案来看,很明显它只是将函数的返回值包装到 a 中Promise,就像那样Promise.then。但这留下了一个新问题。为什么使用的函数await需要async返回 a Promise?
无论你return的函数实际上是什么,你的async函数仍然会返回一个Promise. 如果您return输入数字,它实际上返回一个Promise解析为Number您最初返回的数字。这允许您编写同步“查看”代码。
而不必写出这样的内容:
function foo(){
return Promise.resolve("foo");
}
Run Code Online (Sandbox Code Playgroud)
你可以这样写:
async function foo(){
return "foo";
}
Run Code Online (Sandbox Code Playgroud)
并foo()会自动返回Promise解析为 的a "foo"。
回复您的评论:
它的行为是否像 Promise.then 一样,如果你已经返回了一个 Promise,它不会再次包装它?
await将剥离 Promise 直到它达到一个值:
async function foo() {
return Promise.resolve(Promise.resolve(true));
}
async function bar() {
return true;
}
(async function () {
let tmp;
tmp = await foo();
console.log(tmp);
tmp = await bar();
console.log(tmp);
console.log("Done");
}());
/*
Prints:
true
true
Done
*/
Run Code Online (Sandbox Code Playgroud)
转述@KevinB 的评论。
await,就像生成器中的yield一样,暂停该上下文的执行,直到Promise它正在等待的不再挂起。这在正常功能中不会发生。
如果函数是async但不包含await,则承诺将立即得到解决,并且任何回调都将在下一个tick 上运行。
| 归档时间: |
|
| 查看次数: |
876 次 |
| 最近记录: |