1. ホーム
  2. javascript

javascriptでループ内でコールバックを使用する場合、ループ内で更新された変数をコールバックで使用するために保存する方法はありますか?[重複しています]。

2023-09-07 19:05:44

質問

例えば以下のようなものがあるとします。

for(var i = 0; i < length; i++){
  var variable = variables[i];
  otherVariable.doSomething(variable, function(err){ //callback for when doSomething ends
    do something else with variable;
  }

コールバックが呼ばれるまでに variable は必然的にすべてのコールバックの最後の変数になり、私が望むように、各コールバックで異なる変数になることはありません。私は variabledoSomething() に変換し、それをコールバックの一部として渡すのですが doSomething() は外部ライブラリの一部であり、そのソースコードをいじくり回すことはしたくありません。

私よりもJavaScriptに詳しい方は、私がやりたいことを行うための代替方法があるかどうかご存知でしょうか?

最高、そしてありがとうございます。

Sami

どのように解決するのですか?

この状況に対処するための、醜いとはいえ一般的な方法は、すぐに呼び出される別の関数を使用して、変数を保持するためのスコープを作成することです。

for(var i = 0; i < length; i++) {
  var variable = variables[i];
  otherVariable.doSomething(function(v) { return function(err) { /* something with v */ }; }(variable));
}

すぐに呼び出される関数内で、作成され、返されるコールバックが、関数へのパラメータを参照していることに注意してください。 v を参照しており、外側の variable . これをもっと読みやすくするために、コールバックのコンストラクタを名前付き関数として抽出することをお勧めします。

function callbackFor(v) {
  return function(err) { /* something with v */ };
}
for(var i = 0; i < length; i++) {
  var variable = variables[i];
  otherVariable.doSomething(callbackFor(variable));
}