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 では、このようなコードを書くことは悪い考えであることも十分承知しています。また、「アクティブな待機」もばかげた考えであることも十分に認識しています。したがって、非同期で行う方法などを学ぶようにアドバイスしないでください。そんなこと知ってる。
私が質問している理由は、好奇心と学びたいという願望からです。