是否有任何尝试将C#5.0中的 async / await 功能引用到可以编译为JavaScript的任何语言(例如CoffeScript)? (因此它可以在Web浏览器或node.js中使用。)
答案 0 :(得分:16)
Async位于JavaScript和声的功能列表中。到目前为止,有许多尝试在浏览器或节点中提供此类功能,但它们似乎都没有与和谐提议兼容:
答案 1 :(得分:14)
async / await看起来像coming in ECMAScript 7。这个proposal在2014年1月被接受进入规范流程的第1阶段。
好消息是谷歌traceur compiler已经支持它,所以你今天就可以开始使用它了。
示例语法:
async function asyncValue(value) {
await timeout(50);
return value;
}
async / await也在TypeScript roadmap上。
答案 2 :(得分:7)
我不熟悉C#,但听起来你正在寻找的是某种延续,所以不是写作
fs.readFile 'foo.txt', (err, data) ->
myFunc data
你可以改为写一些像
这样的东西data = &fs.readFile 'foo.txt' # not a real syntax
myFunc data
这不是JavaScript或CoffeeScript提供的。但是,还有其他一些编译器可以做这样的事情:
另请参阅:CoffeeScript wiki上的List of languages that compile to JavaScript。
答案 3 :(得分:5)
是的,你甚至不需要编译它,因为它只是一个简单的JavaScript库。
我的一个名为sharpnr.js的项目旨在扩展具有C#(和.NET当然)的强大功能的JavaScript,如await / async或LINQ。
该库目前处于测试阶段,但它很稳定,几乎支持所有语句(例如loop,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下载图书馆。
答案 4 :(得分:4)
当节点0.11(with v8 3.19 [1],which has generators[2])到达时,您可以使用Galaxy和以下代码。
但是,只有一面旗帜。它们是supported natively in ioJS。
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;
}
答案 5 :(得分:3)
您可以在启用了实验性JS标记的Google Chrome中使用async / await,使用内置生成器,Promises和一小部分spawn() function by Jake Archibald:
spawn(function*() { //this function is async
let story = yield getJSON('story.json'); //yield is like await
addHtmlToPage(story.heading);
});
或者,您可以使用:
对于不支持ES6的浏览器,有Facebook Regenerator。
答案 6 :(得分:3)
好消息,
nodejs支持v7.0.0(好吧,部分),仍然需要和声标志--harmony_async_await
,显然有一些错误,包括内存泄漏,more details,但也有一些问题和一位评论员advises要等到v8版本55,这可能不会很长。
答案 7 :(得分:2)
为了完整性:我发现Saltarelle Compiler(实际上将C#编译为JavaScript)也支持await / async。
答案 8 :(得分:1)
如果您对JavaScript的.NET样式异步编程感兴趣,那么您应该查看Rx for JavaScript。 Rx for JavaScrpt是Microsoft的Reactive Framework的JavaScript端口。反应性框架描述为:
使用。编写异步和基于事件的程序的库 可观察集合和LINQ样式查询运算符。
您可以下载Rx for JavaScript here
您可以阅读更多相关信息,包括示例here
您也可以使用npm:
在节点上安装它npm install rx
它适用于像jQuery这样的库,但我不是CoffeeScript程序员,所以我不确定支持与该语言中的其他JavaScript库的互操作性。
答案 9 :(得分:1)
Javascript在ECMA 7中提供了异步等待功能。现在,可以通过分配它们并等待promise解决来等待所有异步功能。现在,大多数异步函数(如DB调用,API调用,fs和事件)在Javascript和nodeJs中都返回了promise。现在,使用异步等待代码可以使代码更清晰,更易于理解和调试。
示例
function timeout(){
return new Promise( resolve => {
setTimeout(function(){
resolve(true);
}, 5000);
});
}
async function f(){
let result = await timeout();
}
答案 10 :(得分:0)
有https://github.com/loveencounterflow/coffy-script尝试将yield
添加到CoffeeScript。 CoffyScript是非常新的,因为我正在写这篇文章,我正在思考require.extensions
作为一个全球性所构成的困难,以及我是否应该成为一个单独的扩展。也就是说,CoffyScript确实有效,你会在我的github页面上找到许多例子,展示如何使用suspend
,resume
和yield
编写相当简洁的异步代码。
鉴于yield
已经到达NodeJS 11.2,我相信我们应该研究如何使用生成器/协同程序来使异步编程更加可口。我为一个人抛弃了承诺,与他们的经历并没有那么愉快。然后,在所有主流浏览器中yield
可用之前可能需要一段时间。