代码之家  ›  专栏  ›  技术社区  ›  Jeroen

“async”关键字的含义是什么?

  •  -2
  • Jeroen  · 技术社区  · 6 年前

    我一直在阅读节点中的异步/等待。js。我了解到 await 关键字等待解析承诺,或者在承诺被拒绝时引发异常。

    我还了解到,每个想要使用的函数 等候 需要标记 async 。然而 将函数标记为异步意味着什么 ?

    我能找到的所有资源和博客帖子似乎都能解释 等候 非常详细,但忽略 异步 功能,或者简单地掩盖它。例如, this author 如下所示:

    这使得函数隐式返回承诺。

    什么是 异步 关键字真的做了吗?函数隐式返回承诺意味着什么?什么是 副作用 除了能够使用 等候 ?


    好的,从我目前收到的答案来看,很明显它只是将函数的返回值包装成 Promise ,很像 Promise.then 将但这留下了一个新问题。为什么使用 等候 必须是 异步 从而返回 许诺 ?

    3 回复  |  直到 3 年前
        1
  •  3
  •   Jeroen    6 年前

    不管你实际上 return 从您的功能 async 函数仍将返回 Promise 。如果你 回来 一个数字,它实际上返回一个 许诺 这决定于 Number 您最初返回的。这允许您编写同步的“looking”代码。

    不必写下这些:

    function foo(){
        return Promise.resolve("foo");
    }
    

    你可以这样写:

    async function foo(){
        return "foo";
    }
    

    foo() 将自动返回 许诺 决定 "foo"


    针对您的评论:

    它的行为是否像承诺。如果你已经 回报一个承诺,它不会再包装它?

    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
    */
    

    为什么需要异步?

    转述自 @KevinB's comment

    等候 ,就像生成器中的yield一样,暂停该上下文的执行,直到 许诺 它正在等待已不再等待。这在正常功能中不会发生。

    如果函数为 异步 但不包含 等候 ,承诺将立即得到解决,任何回调都将在下一次运行。

        2
  •  1
  •   Wazner    6 年前

    什么是 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);
        }
    }
    

    有关 许诺 键入我建议查看Mozilla开发者网络页面关于 the Promise type

    为什么需要将其标记为异步?为什么不直接使用wait?

    因为您的方法需要拆分为多个“部分”,以便能够执行代码 之后 正在等待的方法。上面的示例有一个连续,但可能有多个。

    JavaScript的设计者希望让开发人员看到运行时正在发挥这种“魔力”。但可能最重要的原因是他们不想使用 await 作为变量名。他们通过 等候 “上下文关键字”。“上下文关键字”只是特定场景中的关键字,在这种情况下:在标记为async的方法中使用时:

    function ABC() 
    {
        var await = 10;
    }
    

    以上内容已编译。但是,如果我将async关键字添加到函数声明中,它将不再这样做,并抛出 Uncaught SyntaxError: Unexpected reserved word

        3
  •  0
  •   Adrian Lineweaver    6 年前

    异步任务运行

    基本思想是在调用函数时使用标记为async的函数而不是生成器,并使用Wait而不是yield,例如:

    (async function() {
        let contents = await readFile('config.json');
        doSomethingWith(contents);
        console.log('Done');
    });
    

    函数前的Async关键字表示函数要以异步方式运行。await关键字表示函数调用 readFile('config.json') 应该返回一个承诺,如果没有,则应将响应封装在承诺中。

    最终的结果是,您可以像编写同步代码一样编写异步代码,而无需管理基于迭代器的状态机。

    • 了解ECMACSCRIPT 6 通过 尼古拉斯·c·扎卡斯