当我阅读Zombie.js的源代码时,我找到了async/await
个关键字:
before(async function() {
await browser.visit('/streaming');
await browser.pressButton('1');
});
为什么可以使用这样的关键字?代码的行为是什么?我试图从代码库中找到一些线索,但不幸运
答案 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 code与Babel。
代码的行为是什么?
它在延续传递方式中基本上意味着以下内容:
before(function() {
browser.visit('/streaming', function() {
browser.pressButton('1');
});
});
答案 3 :(得分:0)
除了模块和类之外,这是有史以来最好的JavaScript之一。看看这两篇文章和图书馆,感受一下力量:
此外,搜索"javascript async await"将会展示一些更好的文章和示例。