5

Node.jsに非同期関数があるとします。基本的には次のようなものです。

var addAsync = function (first, second, callback) {
  setTimeout(function () {
    callback(null, first + second);
  }, 1 * 1000);
};

もちろん、この関数を非同期スタイルで呼び出すことができます。

addAsync(23, 42, function (err, result) {
  console.log(result); // => 65
});

私が疑問に思っているのは、この関数を同期的に呼び出すことができるかどうかです。syncそのために、基本的に次のことを行うラッパー関数が必要です。

var sync = function (fn, params) {
  var res,
      finished = false;

  fn.call(null, params[0], params[1], function (err, result) {
    res = result;
    finished = true;
  });

  while (!finished) {}

  return res;
};

addAsync次に、次のように呼び出すことで、同期的に実行できます。

var sum = sync(addAsync, [23, 42]);

注: もちろん、実際にはparams[0]andを使用することはできませんが、それに応じて配列を使用しますが、この例では物事を単純にしたかったのです。params[1]arguments

さて、問題は、上記のコードが機能しないことです。whileループがブロックされ、イベントループが解放されないため、ブロックするだけです。

私の質問は、このサンプルを意図したとおりに実行することは可能ですか?

私はすでにさまざまなことを試しましたが、どれも役に立ちませんでしsetImmediateた。process.nextTick基本的に必要なのは、Node.js に現在の関数を一時停止し、イベント ループの実行を続行し、後で戻るように指示する方法でした。

yield少なくともNode.js 0.11.2以降では、ジェネレーター関数を使用して同様のことを実現できることを私は知っています。でも、なくても動くのか気になりますよね?

Node.jsで非同期プログラミングを行う方法、イベントループ、および関連するすべてのものを完全に認識していることに注意してください。特に Node.js では、このようなコードを書くことは悪い考えであることも十分承知しています。また、「アクティブな待機」もばかげた考えであることも十分に認識しています。したがって、非同期で行う方法などを学ぶようにアドバイスしないでください。そんなこと知ってる。

私が質問している理由は、好奇心と学びたいという願望からです。

4

3 に答える 3

12

最近、同期モードで非同期関数を呼び出すための単純な抽象化WaitForを作成しました (ファイバーに基づく)。それは初期段階ですが、機能します。試してみてください: https://github.com/luciotato/waitfor

WaitFor を使用すると、コードは次のようになります。

console.log ( wait.for ( addAsync,23,42 ) ) ;

同期関数であるかのように、標準の nodejs 非同期関数を呼び出すことができます。

wait.for(fn,args...)は、例の「同期」機能と同じニーズを満たしますが、ファイバー内で(ノードのイベントループをブロックすることなく)

于 2013-08-12T07:23:59.453 に答える
1
  • npm ファイバー (C++ AddOn プロジェクト) と node-sync を使用できます
  • C(++) でブロッキング呼び出しを実装し、ライブラリとして提供する

はい、知っています-あなたが知っている-しかし、これまで-これまで-これまで;)

ノンブロッキング) 制御フロー ライブラリを使用する

于 2013-07-24T21:01:56.723 に答える
0

標準の propmises と yield (ジェネレーター関数) を使用すると、これを簡単に行うことができます。

http://blog.alexmaccaw.com/how-yield-will-transform-node

http://jlong​​ster.com/A-Study-on-Solving-Callbacks-with-JavaScript-Generators

于 2014-11-11T08:49:30.413 に答える