`async`关键字是什么意思?

时间:2018-04-03 17:55:47

标签: javascript node.js async-await es6-promise

我一直在读node.js中的async / await。我了解到await关键字等待承诺得到解决,或者如果被拒绝则抛出异常。

我还了解到,每个想要使用await的功能都需要标记为async。但是,将函数标记为异步是什么意思?

我能够找到的所有资源和博客文章似乎都非常详细地解释了await,但忽略了async函数的概念,或简要地对它进行了掩饰。例如,this author就像这样:

  

这使得函数隐式返回Promise。

async关键字真的有用吗?函数隐式返回Promise意味着什么?除了能够使用await之外,还有哪些副作用

编辑:

好吧,从我到目前为止收到的答案中可以清楚地知道它只是将函数的返回值包含在Promise中,就像Promise.then那样。这只是留下了一个新问题。为什么使用await的函数需要async,从而返回Promise

3 个答案:

答案 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

为什么需要异步?

@KevinB's comment翻译。

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中。

     

最终结果是您可以编写异步代码,就像它是同步的一样,没有管理基于迭代器的状态机的开销。

    通过 Nicholas c
  • 了解ECMACSCRIPT 6 。 Zakas

答案 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