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、 を返す呼び出しが可能になります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 の実験的機能、具体的にはステージ 1を参照できますes7.asyncFunctions

于 2015-04-25T12:37:58.560 に答える
1

promises と generators に依存するのは、ES7 で計画されている新機能です。

なぜそのようなキーワードを使用できるのでしょうか。

コードBabelでトランスパイルするためです。

コードの動作は何ですか?

基本的に、継続渡しスタイルでは次のことを意味します。

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