Zombie.js のソース コードを読んだときに、次のasync/await
キーワードを見つけました。
before(async function() {
await browser.visit('/streaming');
await browser.pressButton('1');
});
なぜそのようなキーワードを使用できるのでしょうか。コードの動作は何ですか?コードベースから手がかりを見つけようとしましたが、ラッキーではありませんでした
Zombie.js のソース コードを読んだときに、次のasync/await
キーワードを見つけました。
before(async function() {
await browser.visit('/streaming');
await browser.pressButton('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 のサイトのドキュメントを確認すると、実験セクションの 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の特に優れた記事があります。
これらのキーワードは EcmaScript 5 では利用できませんが、EcmaScript 7 (次のバージョン 6 の後に来るバージョン) で提案されています。現在、いくつかの例外を除いて、 Babelを使用して ES6 および一部の ES7 コードを ES5 にトランスコンパイルできます (特にプロキシは ES5 内では不可能なためです)。具体的には、Babel の実験的機能、具体的にはステージ 1を参照できますes7.asyncFunctions
。