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

时间:2011-10-09 14:11:15

标签: javascript async-await

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

11 个答案:

答案 0 :(得分:16)

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

  • 可以使用JS1.7生成器模拟异步(请参阅task.js)。 V8(without experimental mode)尚不支持开箱即用,但可以在FF中使用。可能会使用traceurMasacra编译器将生成器带到其他环境中。
  • node-fibers库为节点中的异步编程提供了其他机制(虽然使性能受到限制)。基于v8cgi的其他尝试描述为here
  • Rhino开箱即用continuations提供了很好的选择。这就是Ringo.js可能值得关注的原因。
  • 很少有基于js2js翻译的解决方案,例如:jscxNarrativeJSjwacsStratifiedJS。有些支持与节点集成。
  • 有很多承诺/未来的库试图在不扩展语法的情况下解决回调问题,但是它们都会遇到可组合性问题,即不能使用像回调之类的循环这样的语言结构。

答案 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提供的。但是,还有其他一些编译器可以做这样的事情:

  • TameJS - 基于JavaScript,主要是添加此功能
  • Kaffeine - 基于JavaScript,添加了许多功能
  • coco - 基于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页面上找到许多例子,展示如何使用suspendresumeyield编写相当简洁的异步代码。

鉴于yield已经到达NodeJS 11.2,我相信我们应该研究如何使用生成器/协同程序来使异步编程更加可口。我为一个人抛弃了承诺,与他们的经历并没有那么愉快。然后,在所有主流浏览器中yield可用之前可能需要一段时间。