簡體   English   中英

在web瀏覽器或node.js中異步/等待?

[英]Async/await in web browser or in node.js?

是否有任何嘗試將C#5.0中的async / await功能引入任何可以編譯為JavaScript的語言(例如CoffeScript)? (因此它可以在Web瀏覽器或node.js.中使用)

Async是JavaScript和聲的功能列表。 到目前為止,有許多嘗試在瀏覽器或節點中提供此類功能,但它們似乎都沒有與和諧提議兼容:

  • 可以使用JS1.7生成器模擬異步(請參閱task.js )。 V8尚未支持開箱即用( 沒有實驗模式 ),但可以在FF中使用。 可能會使用traceurMasacra編譯器將生成器帶到其他環境。
  • 節點光纖庫為節點中的異步編程提供了其他機制(雖然使性能受到限制)。 此處描述基於v8cgi的其他嘗試。
  • 犀牛有延續開箱提供良好的替代。 這就是為什么Ringo.js值得一看的原因。
  • 很少有基於js2js翻譯的解決方案,例如: jscxNarrativeJSjwacsStratifiedJS 有些支持與節點集成。
  • 有許多promise / future庫試圖在不擴展語法的情況下解決回調問題,但是它們都會遇到可組合性問題,即不能使用像回調一樣的循環語言結構。

async / await似乎即將進入ECMAScript 7 提案於2014年1月被納入規范流程的第1階段。

好消息是Googles 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

另請參閱:在CoffeeScript wiki上編譯為JavaScript的語言列表

是的,你甚至不需要編譯它,因為它只是一個簡單的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下載該庫。

當節點0.11( 帶有 生成器[2]的 v8 3.19 [1] )到達時,您可以使用Galaxy和下面的代碼。

但是,只有一面旗幟。 它們在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;
}

您可以在啟用了實驗性JS標記的Google Chrome中進行異步/等待,使用內置生成器,Promises和Jake Archibald的微小spawn()函數

spawn(function*() { //this function is async
      let story = yield getJSON('story.json'); //yield is like await
      addHtmlToPage(story.heading);
});

或者,您可以使用:

對於不支持ES6的瀏覽器,有Facebook Regenerator

好消息

nodejs從v7.0.0(好吧,部分)支持它,仍然需要一個和聲標志--harmony_async_await ,並且顯然有一些錯誤,包括內存泄漏, 更多細節 ,但也有一些擔憂,一位評論員建議等到v8版本55可能不長。

為了完整性:我發現Saltarelle Compiler (實際上將C#編譯為JavaScript)也支持await / async。

Javascript正在為ECMA 7提供async-await功能。現在可以通過宣傳它們並等待承諾解決來等待所有異步功能。 大多數異步函數(如DB調用,API調用,fs和事件)現在都在Javascript和nodeJs中返回承諾。 現在使用async-await代碼更清晰,易懂,可調試。

function timeout(){
  return new Promise( resolve => {
    setTimeout(function(){
      resolve(true);
    }, 5000);
  });
}

async function f(){
    let result = await timeout();
}

如果您對JavaScript的.NET樣式異步編程感興趣,您應該查看Rx for JavaScript。 Rx for JavaScrpt是Microsoft的Reactive Framework的JavaScript端口。 反應框架描述為:

使用可觀察集合和LINQ樣式查詢運算符組成異步和基於事件的程序的庫。

您可以在此處下載Rx for JavaScript

您可以閱讀更多相關信息,包括此處的示例

您也可以使用npm在節點上安裝它:

npm install rx

它適用於像jQuery這樣的庫,但是我不是CoffeeScript程序員,所以我不確定在這種語言中與其他JavaScript庫的互操作性有什么支持。

https://github.com/loveencounterflow/coffy-script嘗試向CoffeeScript添加yield CoffyScript是非常新的,因為我正在寫這篇文章,我正在思考require.extensions所構成的全局性問題,以及我是否應該成為一個單獨的擴展。 也就是說,CoffyScript確實有效,你會在我的github頁面上找到許多例子,展示如何使用suspendresumeyield編寫相當簡潔的異步代碼。

鑒於yield已經到達NodeJS 11.2,我相信我們應該研究如何使用生成器/協同程序來使異步編程更加可口。 我為一個人拋棄了承諾,與他們的經歷並沒有那么愉快。 然后,可能需要一段時間才能在所有主流瀏覽器中yield

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM