如何使用v8打字稿中发布的顶级Async等待

时间:2020-02-24 05:48:33

标签: javascript typescript async-await

我正在努力了解这个新功能(顶级异步等待)到底意味着什么from v8 features list

当我尝试在vanila JS中运行时,结果对我来说似乎是完全相同的,这就是我尝试在vanilla JS中执行的操作。

(() => {
  let test1 = async() =>
    async() => {
      return 'true';
    };

  (async() => {
    let result = await test1();
    result = await result();
    console.log('r', result)
  })();

})()

我想知道此功能的确切含义以及使用方法。

2 个答案:

答案 0 :(得分:2)

这里是v8's document。对我来说,这是自我描述,对我个人来说非常方便。

以前,您不能无所事事地编写await someAsyncFunction(),因为要 await ,必须在await函数内调用async

示例:

main.js

const fs = require('fs');
const util = require('util');
const unlink = util.promisify(fs.unlink); // promisify unlink function
await unlink('file_path'); // delete file

上面的代码不起作用。最后一行会给您一个错误。因此,我们之前所做的是这样的:

async function main() {
    const fs = require('fs');
    const util = require('util');
    const unlink = util.promisify(fs.unlink); // promisify unlink function
    await unlink('file_path'); // delete file
}
main();

但是,现在您不必(!)。第一个代码将起作用。

此答案基于我的理解

答案 1 :(得分:0)

顶级异步等待使您可以等待模块顶层的异步函数返回的承诺,而不必声明单独的异步函数。最重要的是,您现在可以方便地export由异步函数返回的值。

例如,如果没有此功能,则需要创建一个单独的异步函数(通常为“主”异步函数),或使用Promise.then来对返回值进行顶层处理,并且不能简单地导出返回值。

  let test = async () => 'true';

  test().then(result => console.log('r', result));

  // or even more verbose
  (async () => {
    console.log(await test());
  })();

  // This exports a Promise, not the returned value, "true".
  export let result = test();

  // This throws an Error because export should be at the top-level.
  (async () => {
    export let result = await test();
  })();

但是有了这项新功能,您可以轻松做到:

  let test = async () => 'true';
  export let result = await test();
  console.log(result);

当您要导出必须异步获取的值时,此功能特别有用;例如,您在运行时从网络获得的值,或者是像大型加密套件这样的模块,该模块很大,并且加载缓慢且异步。