我一直在读node.js中的async / await。我了解到await
关键字等待承诺得到解决,或者如果被拒绝则抛出异常。
我还了解到,每个想要使用await
的功能都需要标记为async
。但是,将函数标记为异步是什么意思?
我能够找到的所有资源和博客文章似乎都非常详细地解释了await
,但忽略了async
函数的概念,或简要地对它进行了掩饰。例如,this author就像这样:
这使得函数隐式返回Promise。
async
关键字真的有用吗?函数隐式返回Promise意味着什么?除了能够使用await
之外,还有哪些副作用?
好吧,从我到目前为止收到的答案中可以清楚地知道它只是将函数的返回值包含在Promise
中,就像Promise.then
那样。这只是留下了一个新问题。为什么使用await
的函数需要async
,从而返回Promise
?
答案 0 :(得分:3)
无论您的功能实际为return
,您的async
功能仍会返回Promise
。如果您return
是一个数字,它实际上会返回一个Promise
,它会解析为您最初返回的Number
。这允许你写同步"寻找"代码。
而不是写出来:
function foo(){
return Promise.resolve("foo");
}
你可以这样写:
async function foo(){
return "foo";
}
和foo()
会自动返回解析为Promise
的{{1}}。
回复你的评论:
它的行为就像Promise.then那样,如果你已经 返回一个承诺,它不会再包裹它?
"foo"
将剥离Promise,直到达到一个值:
await
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
*/
,就像生成器中的yield一样,暂停执行该上下文,直到它等待的await
不再等待。这在正常功能中不会发生。
如果函数是Promise
但不包含async
,则承诺将立即得到解决,并且任何回调都将在下一个时间点运行。
答案 1 :(得分:0)
正在运行的异步任务
基本思想是使用标记为async而不是生成器的函数,并在调用函数时使用await而不是yield,例如:
(async function() {
let contents = await readFile('config.json');
doSomethingWith(contents);
console.log('Done');
});
函数之前的异步关键字表示该函数旨在以异步方式运行。 await关键字表示函数调用
readFile('config.json')
应该返回一个promise,如果没有,则响应应该包含在一个promise中。最终结果是您可以编写异步代码,就像它是同步的一样,没有管理基于迭代器的状态机的开销。
答案 2 :(得分:0)
async
做什么? async
是用于制作方法链Promise
对象的语法糖。
例如,采用以下方法:
async function myFunction(a)
{
if (a == 10)
{
await otherFunction();
}
return 10;
}
您使用的JavaScript运行时可能会生成更优化的代码,但最简单的方法就是这样:
function myFunction(a)
{
if (a === 10)
{
return otherFunction()
.then(() => myFunction_continuation());
}
else
{
return myFunction_continuation();
}
function myFunction_continuation()
{
return Promise.resolve(10);
}
}
有关Promise
类型的文档,我建议您查看有关the Promise
type的Mozilla开发人员网络页面。
因为您的方法需要分成多个部分"因为它可以让代码在等待方法之后执行。上面的示例只有一个延续,但可能有多个。
JavaScript的设计者希望开发人员可以看到运行时正在执行此操作" magic"。但也许最重要的原因是他们不希望使用await
作为变量名来破坏现有代码。他们通过制作await
"上下文关键字"来实现此目的。 A"上下文关键字"在这种情况下,它只是特定场景中的关键字:在标记为async:
function ABC()
{
var await = 10;
}
以上编译。但是,如果我将async关键字添加到函数声明中,它就不再执行,并抛出Uncaught SyntaxError: Unexpected reserved word
。