C# 5.0 から JavaScript にコンパイルできる言語 (CoffeScript など)にasync/await機能を導入する試みはありますか? (したがって、Web ブラウザーまたは node.js のいずれかで使用できます。)
11 に答える
非同期は JavaScript ハーモニーの機能リストにあります。これまでのところ、ブラウザーまたはノードでそのような機能を提供する試みが数多く行われていますが、いずれも調和の提案と互換性があるようには見えません。
- 非同期は JS1.7 ジェネレーターでシミュレートできます ( task.jsを参照)。V8 (実験モードなし) ではすぐに使用できるサポートはまだありませんが、FF では動作します。おそらくtraceurまたはMasacraコンパイラを使用して、ジェネレータを他の環境に持ち込むことができます。
- ノードでの非同期プログラミングのための他のメカニズムを提供するノードファイバーライブラリがあります(ただし、パフォーマンスは犠牲になります)。v8cgi に基づくその他の試みについては、こちらに記載されています。
- Rhinoにはすぐに使用できる継続があり、優れた代替手段を提供します。これが、Ringo.jsを検討する価値がある理由です。
- js2js 変換に基づくソリューションはほとんどありません (例: jscx、NarrativeJS、jwacs、StratifiedJS ) 。ノードとの統合をサポートするものもあります。
- 構文を拡張せずにコールバックの問題を解決しようとする promise/future ライブラリが多数ありますが、それらはすべて構成可能性の問題に悩まされています。つまり、コールバック全体のループのような言語構造を使用できません。
async/await はECMAScript 7 で登場するようです。この提案は、2014 年 1 月に仕様プロセスのステージ 1 に受け入れられました。
幸いなことに、Google のtraceur コンパイラは既にそれをサポートしているため、今日から使用を開始できます。
サンプル構文:
async function asyncValue(value) {
await timeout(50);
return value;
}
async/await もTypeScript ロードマップに含まれています。
I'm not familiar with C#, but it sounds like what you're looking for is some sort of continuations, so that instead of writing
fs.readFile 'foo.txt', (err, data) ->
myFunc data
you could instead just write something like
data = &fs.readFile 'foo.txt' # not a real syntax
myFunc data
This isn't something that JavaScript or CoffeeScript provides. However, there are several other compilers that can do something like this:
- TameJS - JavaScript-based, mainly just adds this feature
- Kaffeine - JavaScript-based, adds a bunch of features
- coco - CoffeeScript-based
See also: List of languages that compile to JavaScript on the CoffeeScript wiki.
はい、あります。単純な JavaScript ライブラリであるため、コンパイルする必要さえありません。
私のプロジェクトの 1 つである Sharpnr.js は、await/async や LINQ などの C# (およびもちろん .NET) の優れた機能を使用して JavaScript を拡張することを目的としています。
ライブラリは現在ベータ版ですが、安定しており、ほぼすべてのステートメント (ループ、スイッチ、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 ( with v8 3.19 [1]、generators[2] を含む) が到着すると、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;
}
組み込みのジェネレーター、Promises、および Jake Archibald による小さなspawn() 関数を使用して、Experimental JS フラグを有効にして Google Chrome で async/await を使用できます。
spawn(function*() { //this function is async
let story = yield getJSON('story.json'); //yield is like await
addHtmlToPage(story.heading);
});
または、次を使用できます。
- Kris Kowal による async() と spawn() を使用した Q
- Co by Visionmedia
- ジョナサン・オングによって待っています
- Task.js by Mozilla
- Forbes Lindesay によるその後の利回り
- cujoJSによる場合
ES6 をサポートしていないブラウザーには、Facebook Regeneratorがあります。
完全を期すために: Saltarelle Compiler (実際に C# を JavaScript にコンパイルする) も await/async をサポートすることがわかりました。
JavaScript の .NET スタイルの非同期プログラミングに興味がある場合は、Rx for JavaScript を調べる必要があります。Rx for JavaScrpt は、Microsoft の Reactive Framework の JavaScript ポートです。リアクティブ フレームワークは次のように記述されます。
監視可能なコレクションと LINQ スタイルのクエリ演算子を使用して、非同期およびイベント ベースのプログラムを作成するためのライブラリ。
Rx for JavaScriptはこちらからダウンロードできます
詳細については、こちらの例をご覧ください。
npm を使用してノードにインストールすることもできます。
npm インストール rx
jQuery などのライブラリでうまく動作しますが、私は CoffeeScript プログラマーではないため、この言語の他の JavaScript ライブラリとの相互運用性がどのようにサポートされているかはわかりません。
CoffeeScriptに追加しようとしているhttps://github.com/loveencounterflow/coffy-scriptがあります。yield
CoffyScript は非常に新しいものであり、これを書いているときrequire.extensions
に、グローバルであることによってもたらされる問題と、別の拡張機能にする必要があるかどうかについて熟考しています。suspend
そうは言っても、CoffyScript は機能します。私の github ページには、 、resume
、およびを使用して非常に簡潔な非同期コードを記述する方法を示す多数の例がありyield
ます。
それyield
が NodeJS 11.2 に登場したことを考えると、ジェネレーター/コルーチンを使用して非同期プログラミングをより快適にする方法を研究する必要があると思います。私は約束を破ったことがあり、それらとの経験はそれほど楽しいものではありませんでした. yield
繰り返しになりますが、すべての主要なブラウザーで利用できるようになるまでには時間がかかる場合があります。