在web浏览器或node.js中异步/等待?

TN.*_*TN. 22 javascript async-await

是否有任何尝试将C#5.0中的async/await功能引入任何可以编译为JavaScript的语言(例如CoffeScript)?(因此它可以在Web浏览器或node.js.中使用)

use*_*328 16

Async是JavaScript和声的功能列表.到目前为止,有许多尝试在浏览器或节点中提供此类功能,但它们似乎都没有与和谐提议兼容:

  • 可以使用JS1.7生成器模拟异步(请参阅task.js).V8尚未支持开箱即用(没有实验模式),但可以在FF中使用.可能会使用traceurMasacra编译器将生成器带到其他环境.
  • 节点光纤库为节点中的异步编程提供了其他机制(虽然使性能受到限制).此处描述基于v8cgi的其他尝试.
  • 犀牛有延续开箱提供良好的替代.这就是为什么Ringo.js值得一看的原因.
  • 很少有基于js2js翻译的解决方案,例如:jscx,NarrativeJS,jwacs,StratifiedJS.有些支持与节点集成.
  • 有许多承诺/未来的库试图在不扩展语法的情况下解决回调问题,但是它们都受到可组合性问题的困扰,即不能在回调中使用类似循环的语言结构.


Bre*_*tin 14

async/await似乎即将进入ECMAScript 7.该提案于2014年1月被纳入规范流程的第1阶段.

好消息是Googles traceur编译器已经支持它,所以你今天就可以开始使用它了.

示例语法:

async function asyncValue(value) {
  await timeout(50);
  return value;
}
Run Code Online (Sandbox Code Playgroud)

async/await也在TypeScript路线图上.

  • 节点v7.0.0的等待已经结束了,[几乎](https://github.com/nodejs/promises/issues/4#issuecomment-251025934) (2认同)

Tre*_*ham 7

我不熟悉C#,但听起来你正在寻找的是某种延续,所以不是写作

fs.readFile 'foo.txt', (err, data) ->
  myFunc data
Run Code Online (Sandbox Code Playgroud)

你可以改为写点东西

data = &fs.readFile 'foo.txt'  # not a real syntax
myFunc data
Run Code Online (Sandbox Code Playgroud)

这不是JavaScript或CoffeeScript提供的.但是,还有其他几个编译器可以执行以下操作:

  • TameJS - 基于JavaScript,主要是添加此功能
  • Kaffeine - 基于JavaScript,增加了许多功能
  • coco - 基于CoffeeScript

另请参阅:在CoffeeScript wiki上编译为JavaScript的语言列表.

  • 我可以提一下,为javascript添加这样的语法有一整套否定,比如必须信任编译的代码,必须理解编译的代码,必须调试编译的代码,并试图在异步环境中滥用同步设计模式.基本上他们是抽象,很容易泄漏,除非你确切知道你在做什么,我相信只有模块作者和少数人知道他们在做什么 (2认同)

小智 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");
Run Code Online (Sandbox Code Playgroud)

关于jsfiddle的工作示例.

您可以从github下载该库.