在web浏览器或node.js中Async/await
Async/await in web browser or in node.js?
是否有任何尝试将async/await功能从c# 5.0带到任何可以编译为JavaScript的语言(如CoffeScript)?(所以它可以在web浏览器或node.js中使用)
Async是JavaScript和谐的功能列表。到目前为止,有很多尝试在浏览器或节点中提供这样的功能,但它们似乎都不兼容harmony提案:
- Async可以用JS1.7生成器模拟(参见task.js)。V8还不支持开箱即用(没有实验模式),但可以在FF中工作。可以使用traceur或Masacra编译器将生成器带到其他环境中。
- 有一个节点-光纤库,为节点中的异步编程提供了其他机制(尽管会降低性能)。这里描述了基于v8cgi的其他尝试。 Rhino有开箱即用的延续,提供了很好的替代方案。这就是为什么Ringo.js值得一看。
- 基于js2js翻译的解决方案很少,例如:jscx, narativejs, jwacs, StratifiedJS。部分支持与node集成。
- 有许多承诺/未来的库试图在不扩展语法的情况下解决回调问题,但是它们都存在可组合性问题,即不能在回调中使用循环这样的语言结构。
async/await将在ECMAScript 7中出现。该提案于2014年1月被接受进入规范流程的第一阶段。
好消息是google的traceur编译器已经支持它了,所以你今天就可以开始使用它了。
示例语法:
async function asyncValue(value) {
await timeout(50);
return value;
}
async/await也在TypeScript的路线图上。
我不熟悉c#,但听起来你想要的是某种延续,所以不要写
fs.readFile 'foo.txt', (err, data) ->
myFunc data
你可以直接写成
data = &fs.readFile 'foo.txt' # not a real syntax
myFunc data
这不是JavaScript或CoffeeScript提供的东西。然而,有几个其他的编译器可以做这样的事情:
- TameJS -基于javascript,主要是添加了这个特性
- Kaffeine -基于javascript,添加了一堆特性
- coco - CoffeeScript-based
参见:CoffeeScript wiki上编译成JavaScript的语言列表。
有,你甚至不需要编译它,因为它只是一个简单的JavaScript库。
我有一个叫做sharpnr.js的项目,它的目标是用c#(当然还有。net)的强大特性来扩展JavaScript,比如await/async,或者LINQ。
该库目前处于测试阶段,但它很稳定,几乎支持所有语句(例如loops, switch, if),并且与现有库(如jQuery)配合良好。
await/async语法几乎与c#版本相同:
var getAsync = async(function(url) {
var result = await; $.get(url);
$("#test").html(result);
});
getAsync("http://www.sharpnrjs.com");
jsfiddle的工作示例。
你可以从github下载这个库。
当Node 0.11 (v8 3.19[1],它有生成器[2])到达时,您可以像下面这样使用Galaxy和代码。
然而,只有在旗帜后面。
function* countLines(path) {
var names = yield fs.readdir(path);
var total = 0;
for (var i = 0; i < names.length; i++) {
var fullname = path + '/' + names[i];
if ((yield fs.stat(fullname)).isDirectory()) {
total += yield countLines(fullname);
} else {
var count = (yield fs.readFile(fullname, 'utf8')).split(''n').length;
console.log(fullname + ': ' + count);
total += count;
}
}
return total;
}
function* projectLineCounts() {
var total = 0;
total += yield countLines(__dirname + '/../examples');
total += yield countLines(__dirname + '/../lib');
total += yield countLines(__dirname + '/../test');
console.log('TOTAL: ' + total);
return total;
}
你可以有async/await在Google Chrome与实验JS标志启用,使用内置的生成器,承诺和一个微小的spawn()函数由Jake Archibald:
spawn(function*() { //this function is async
let story = yield getJSON('story.json'); //yield is like await
addHtmlToPage(story.heading);
});
或者,您可以使用:
- Q与async()和spawn()由Kris Kowal
- Co by Visionmedia
- 待定目录 tasks .js
- 福布斯林赛产量
对于不支持ES6的浏览器,有Facebook Regenerator。
好消息,
nodejs从v7.0.0开始支持它(好吧,部分),仍然需要一个和谐标志--harmony_async_await
,并且显然有一些错误,包括内存泄漏,了解更多细节,但也有一些问题,一位评论员建议等到v8版本55,这可能不会太久。
为了完整:我发现Saltarelle编译器(它实际将c#编译为JavaScript)也支持await/async。
如果你对。net风格的JavaScript异步编程感兴趣,你应该看看Rx for JavaScript。Rx for JavaScript是微软响应式框架的JavaScript移植版。响应式框架的描述如下:
一个库,用于编写异步和基于事件的程序可观察集合和linq风格的查询操作符。
你可以在这里下载Rx for JavaScript
你可以阅读更多关于它的内容,包括这里的例子
你也可以使用npm:
npm install rx
它与jQuery等库一起工作得很好,但是我不是CoffeeScript程序员,所以我不确定这种语言中对与其他JavaScript库的互操作性有什么支持。
Javascript在ECMA 7中提供async-await特性。现在所有的异步函数都可以通过承诺和等待承诺解决来等待。大多数异步函数,如DB调用、API调用、fs和事件,现在在Javascript和nodeJs中都返回promise。现在,使用async-await的代码更清晰、可理解、可调试。
例子function timeout(){
return new Promise( resolve => {
setTimeout(function(){
resolve(true);
}, 5000);
});
}
async function f(){
let result = await timeout();
}
有https://github.com/loveencounterflow/coffy-script这是尝试添加yield
到CoffeeScript。CoffyScript是非常新的,因为我正在写这篇文章,我正在思考require.extensions
是一个全球性的困难,以及我是否应该是一个单独的扩展。也就是说,CoffyScript确实可以工作,您可以在我的github页面上找到许多示例,展示如何使用suspend
, resume
和yield
编写相当简洁的异步代码。
考虑到yield
已经到达NodeJS 11.2,我认为我们应该研究如何使用生成器/协程使异步编程更容易接受。就我个人而言,我曾放弃过承诺,因为兑现承诺的经历并不那么愉快。不过,yield
在所有主流浏览器中可用可能还需要一段时间。
- 如何在 es6 javascript 类中使用 async/await
- 使用Babel.js的Transpile Async Await提案
- 为什么babel将async/await转换为再生器
- 如何在我的gulpfile.babel.js中使用ES2016/ES7提案进行async/await
- Nodejs中的async/await替换
- async/await w/ koa 2 & mongoose
- 如何在 Node JS FS 模块中使用 Typescript Async/ await with promise
- Typescript async/await and angular $q service
- 几乎可以在任何地方使用 async/await 吗?
- 将 redux-saga 与 ES6 生成器与 ES2017 async/await 一起使用 redux-thunk
- 如何在Gulp 4中使用async/await
- Typescript async/await Promise调用差异
- async/await and recursion
- javascript : Async/await in .replace
- babel 6 async/await:意外的令牌
- 如何在流中使用ES8 async/await
- 如何使用async/await捕获抛出的错误
- JavaScript async/await and do/while loop
- 节点回调以 async/await 承诺
- 我如何在Koa.js应用程序的验收测试中使用ES2016 (ES7) async/await ?