23

C# 5.0 から JavaScript にコンパイルできる言語 (CoffeScript など)にasync/await機能を導入する試みはありますか? (したがって、Web ブラウザーまたは node.js のいずれかで使用できます。)

4

11 に答える 11

17

非同期は JavaScript ハーモニーの機能リストにあります。これまでのところ、ブラウザーまたはノードでそのような機能を提供する試みが数多く行われていますが、いずれも調和の提案と互換性があるようには見えません。

  • 非同期は JS1.7 ジェネレーターでシミュレートできます ( task.jsを参照)。V8 (実験モードなし) ではすぐに使用できるサポートはまだありませんが、FF では動作します。おそらくtraceurまたはMasacraコンパイラを使用して、ジェネレータを他の環境に持ち込むことができます。
  • ノードでの非同期プログラミングのための他のメカニズムを提供するノードファイバーライブラリがあります(ただし、パフォーマンスは犠牲になります)。v8cgi に基づくその他の試みについては、こちらに記載されています。
  • Rhinoにはすぐに使用できる継続があり、優れた代替手段を提供します。これが、Ringo.jsを検討する価値がある理由です。
  • js2js 変換に基づくソリューションはほとんどありません (例: jscxNarrativeJSjwacsStratifiedJS ) 。ノードとの統合をサポートするものもあります。
  • 構文を拡張せずにコールバックの問題を解決しようとする promise/future ライブラリが多数ありますが、それらはすべて構成可能性の問題に悩まされています。つまり、コールバック全体のループのような言語構造を使用できません。
于 2012-06-03T11:38:51.110 に答える
15

async/await はECMAScript 7 で登場するようです。この提案は、2014 年 1 月に仕様プロセスのステージ 1 に受け入れられました。

幸いなことに、Google のtraceur コンパイラは既にそれをサポートしているため、今日から使用を開始できます。

サンプル構文:

async function asyncValue(value) {
  await timeout(50);
  return value;
}

async/await もTypeScript ロードマップに含まれています。

于 2014-08-11T16:14:43.363 に答える
7

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.

于 2011-10-09T14:18:56.797 に答える
5

はい、あります。単純な 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からダウンロードできます。

于 2012-07-03T16:35:25.027 に答える
4

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;
}
于 2013-06-11T17:50:09.343 に答える
3

組み込みのジェネレーター、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);
});

または、次を使用できます。

ES6 をサポートしていないブラウザーには、Facebook Regeneratorがあります。

于 2014-08-06T21:19:12.790 に答える
3

良いニュース

nodejs は v7.0.0 から (まあ、部分的に) サポートしていますが、まだ調和フラグが必要です。詳細については--harmony_async_await、メモリ リークを含むいくつかのバグがあるようですが、いくつかの懸念事項もあり、あるコメンテーターはv8 バージョン 55 まで待つようアドバイスしています。長くはないかもしれません。

于 2016-10-27T13:13:11.937 に答える
2

完全を期すために: Saltarelle Compiler (実際に C# を JavaScript にコンパイルする) も await/async をサポートすることがわかりました。

于 2013-06-04T09:20:26.363 に答える
1

JavaScript の .NET スタイルの非同期プログラミングに興味がある場合は、Rx for JavaScript を調べる必要があります。Rx for JavaScrpt は、Microsoft の Reactive Framework の JavaScript ポートです。リアクティブ フレームワークは次のように記述されます。

監視可能なコレクションと LINQ スタイルのクエリ演算子を使用して、非同期およびイベント ベースのプログラムを作成するためのライブラリ。

Rx for JavaScriptはこちらからダウンロードできます

詳細については、こちらの例をご覧ください。

npm を使用してノードにインストールすることもできます。

npm インストール rx

jQuery などのライブラリでうまく動作しますが、私は CoffeeScript プログラマーではないため、この言語の他の JavaScript ライブラリとの相互運用性がどのようにサポートされているかはわかりません。

于 2011-10-09T14:29:17.187 に答える
0

CoffeeScriptに追加しようとしているhttps://github.com/loveencounterflow/coffy-scriptがあります。yieldCoffyScript は非常に新しいものであり、これを書いているときrequire.extensionsに、グローバルであることによってもたらされる問題と、別の拡張機能にする必要があるかどうかについて熟考しています。suspendそうは言っても、CoffyScript は機能します。私の github ページには、 、resume、およびを使用して非常に簡潔な非同期コードを記述する方法を示す多数の例がありyieldます。

それyieldが NodeJS 11.2 に登場したことを考えると、ジェネレーター/コルーチンを使用して非同期プログラミングをより快適にする方法を研究する必要があると思います。私は約束を破ったことがあり、それらとの経験はそれほど楽しいものではありませんでした. yield繰り返しになりますが、すべての主要なブラウザーで利用できるようになるまでには時間がかかる場合があります。

于 2013-06-12T11:39:49.407 に答える