【问题标题】:What's the synax `async/await` in zombiejs code?僵尸代码中的“async/await”语法是什么?
【发布时间】:2015-07-04 02:27:01
【问题描述】:

看了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

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

【问题讨论】:

标签: javascript async-await babeljs zombie.js ecmascript-2016


【解决方案1】:

如果我们查看用于构建该项目的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 网站上的文档,我们可以看到在 experimental section 的 ES7 部分中,有一个 asyncFunctions 的实现。

这些关键字是 ES7 规范的一部分,但尚未稳定。因此它们被包含在 Babel 的实验特性中。

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

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

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

PouchDB 有一个特别的 good article 解释了这些功能的真实用例。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是一个计划用于 ES7 的 new feature,它依赖于 Promise 和生成器。

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

      因为他们transpile the codeBabel

      代码的行为是什么?

      在续传风格中基本意思如下:

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

      【讨论】:

        【解决方案4】:

        这是 JavaScript 除了模块和类之外最好的东西之一。查看这两篇文章和图书馆,感受一下它的强大功能:

        此外,搜索"javascript async await" 会发现更多优秀的文章和示例。

        【讨论】:

          猜你喜欢
          • 2011-03-14
          • 1970-01-01
          • 2012-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-24
          • 2019-02-05
          相关资源
          最近更新 更多