2

当我阅读 Zombie.js 的源代码时,我发现了async/await关键字:

before(async function() {
  await browser.visit('/streaming');
  await browser.pressButton('1');
});

https://github.com/assaf/zombie/blob/41807a39c7aa1a13c4ef51575e0d581be96175bc/test/event_source_test.js#L60

为什么它可以使用这样的关键字?代码的行为是什么?我试图从代码库中找到一些线索,但并不幸运

4

4 回答 4

2

如果我们检查gulpfile用于构建该项目的 ,我们可以看到源是通过管道传输的babel

gulp.task('build', ['clean'], function() {
  return gulp
    .src('src/**/*.js')
    .pipe(sourcemaps.init())
    .pipe(babel({
      experimental: true,
      loose:        'all',
      optional:     [
        'bluebirdCoroutines',
        'runtime'
      ]
    }))
});

Babel是一个转译器,它允许您编写 ES6+ 代码并将其转译回 ES5。

Babel 会将您的 ES6+ 代码转换为 ES5 友好代码,因此您可以立即开始使用它,而无需等待浏览器支持。

如果我们查看 Babel 网站上的文档,我们可以看到在实验部分的 ES7 部分中,有一个asyncFunctions.

这些关键字是 ES7 规范的一部分,但还没有稳定下来。因此它们被包含为 Babel 的实验特性。

简而言之,一个async函数将允许您进行await一个返回 a 的调用promise

async function() {
  // flow will be suspended here until
  // the promise returned by someFunction is resolved
  await someFunction()
}

ES6 将包括所谓的生成器,它们做类似的事情,但不特定于 Promise。您可能会开始看到yield关键字,或者像这样声明的函数function* () {}。它们就是所谓的生成器函数。

PouchDB有一篇特别好的文章,它解释了这些功能的真实用例。

于 2015-04-25T12:40:01.033 回答
1

这些关键字在 EcmaScript 5 中不可用,但建议用于 EcmaScript 7(即将发布的版本 6 之后的版本)。现在你可以使用Babel将 ES6 和一些 ES7 代码转编译成 ES5,但有一些例外(特别是代理,因为它在 ES5 中是不可能的)。具体来说,可以参考 Babel 的实验特性,特别是 Stage 1 es7.asyncFunctions,。

于 2015-04-25T12:37:58.560 回答
1

这是为 ES7 计划的一个新特性,它依赖于 Promise 和生成器。

为什么它可以使用这样的关键字?

因为他们用Babel编译代码

代码的行为是什么?

它基本上意味着以下连续传递风格:

before(function() {
  browser.visit('/streaming', function() {
    browser.pressButton('1');
  });
});
于 2015-04-25T12:38:57.360 回答
0

这是 JavaScript 除了模块和类之外最好的事情之一。查看这两篇文章和图书馆,感受一下强大的力量:

此外,搜索“javascript async await”会出现更多好的文章和示例。

于 2016-01-06T00:44:42.270 回答