什么是zombiejs代码中的synax`async / await`?

时间:2015-04-25 12:30:36

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

当我阅读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 个答案:

答案 0 :(得分: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网站上的文档,我们可以看到experimental section的ES7部分中有asyncFunctions的实现。

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

简单来说,async功能可让您await拨打promise的电话。

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

ES7计划的new feature取决于承诺和生成器。

  

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

因为他们transpile the codeBabel

  

代码的行为是什么?

它在延续传递方式中基本上意味着以下内容:

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

答案 3 :(得分:0)

除了模块和类之外,这是有史以来最好的JavaScript之一。看看这两篇文章和图书馆,感受一下力量:

此外,搜索"javascript async await"将会展示一些更好的文章和示例。