当我阅读 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
一个返回 a 的调用promise
。
async function() {
// flow will be suspended here until
// the promise returned by someFunction is resolved
await someFunction()
}
ES6 将包括所谓的生成器,它们做类似的事情,但不特定于 Promise。您可能会开始看到yield
关键字,或者像这样声明的函数function* () {}
。它们就是所谓的生成器函数。
PouchDB有一篇特别好的文章,它解释了这些功能的真实用例。
这是 JavaScript 除了模块和类之外最好的事情之一。查看这两篇文章和图书馆,感受一下强大的力量:
此外,搜索“javascript async await”会出现更多好的文章和示例。