非同期プログラミングを機能させる方法に頭を悩ませようとしています。
私の現在のユースケースでは、1 秒間に複数回呼び出される可能性のある関数があり、関数間で変化する可能性のある複数の変数に依存するコールバックがあります。
簡単な例: (簡潔にするために coffeescript を使用)
doSomething = (requestor, thing, action, callback) ->
thing.takeAction action, (result) ->
# actually a lot of times this nests down even further
requestor.report result
callback result
thing.takeAction が結果を返す前に doSomething が異なるデータで複数回呼び出された場合、リクエスターとコールバックが必要なものと同じであることを信頼できないと思います。正しい?
これを回避するには、requestor と callback を takeAction の callback に挿入する必要があります。それはどういうわけか可能ですか?
私は次のようなことをするという考えを得ました
doSomething = (requestor, thing, action, callback) ->
thing.takeAction action, (result, _requestor = requestor, _callback = callback) ->
_requestor.report result
_callback result
しかしもちろん、これは単なる CoffeeScript のハックであり、まったく機能しません。
ところで、私は caolan/async モジュールを使用してこれを支援しようとしていましたが、async が提供できるよりも多くの変数がコールバックで必要になることが多いという事実は依然として残っています。お気に入り:
doSomething = function(requestor, thing, action, callback) {
// this might not need a waterfall, but imagine it would have nested further
async.waterfall(
[
function(next) {
thing.takeAction(action, function(result) {
// How can I know that action is still the same?
next(null, result);
});
},
function(result, next) {
requestor.report(result); // requestor still the same?
next(null, result);
}
],
function(err, result) {
callback(result); // callback still the same?
});
}
それでも同じ問題が残ります。では、これを行うにはどうすればよいですか?
お時間をいただきありがとうございます。