[英]Async/await in web browser or in node.js?
是否有任何嘗試將C#5.0中的async / await功能引入任何可以編譯為JavaScript的語言(例如CoffeScript)? (因此它可以在Web瀏覽器或node.js.中使用)
Async是JavaScript和聲的功能列表。 到目前為止,有許多嘗試在瀏覽器或節點中提供此類功能,但它們似乎都沒有與和諧提議兼容:
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提供的。 但是,還有其他幾個編譯器可以執行以下操作:
另請參閱:在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 。
為了完整性:我發現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頁面上找到許多例子,展示如何使用suspend
, resume
和yield
編寫相當簡潔的異步代碼。
鑒於yield
已經到達NodeJS 11.2,我相信我們應該研究如何使用生成器/協同程序來使異步編程更加可口。 我為一個人拋棄了承諾,與他們的經歷並沒有那么愉快。 然后,可能需要一段時間才能在所有主流瀏覽器中yield
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.