在web浏览器或node.js中Async/await

Async/await in web browser or in node.js?

本文关键字:Async await js node web 浏览器      更新时间:2023-09-26

是否有任何尝试将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, resumeyield编写相当简洁的异步代码。

考虑到yield已经到达NodeJS 11.2,我认为我们应该研究如何使用生成器/协程使异步编程更容易接受。就我个人而言,我曾放弃过承诺,因为兑现承诺的经历并不那么愉快。不过,yield在所有主流浏览器中可用可能还需要一段时间。