2016-03-26 7 views
0

この関数はabの異なる値で複数回呼び出されるノードで返った後にコールバックに対応する非同期関数のパラメータを取得する方法は?

function sample(a, b) { 

    var params = { 
     a: a, 
     b: b 
    }; 

    myService.doMyJob(params, function(err, response) { 
     if (err) 
      //do something 

     //access params.a and params.b 

    }); 
} 

以下のように私はnodejs機能を持っています。返されるコールバックに対応するabの値を取得する方法はありますか?

注:論理的には、成功コールバックの結果とともに、abという値をサービスから返すことはできません。

答えて

0

あなたのコードはそのまま動作します。コールバック関数はparamsオブジェクトの周りにクロージャを持ち、目的の値にアクセスできるようにします。例えば


var myService = { 
    doMyJob: function(params, cb){ 
    return cb(); 
    } 
}; 

function sample(a, b) { 

    var params = { 
     a: a, 
     b: b 
    }; 

    myService.doMyJob(params, function(err, response) { 
     if (err) { throw err; } 

     //access params.a and params.b 
     console.log(params.a); 
     console.log(params.b); 

    }); 
} 

sample("a", "b"); 

このCONSOLE.LOGます

以下のコメントから

B

を更新

ここでは、ループを使用し、setTimeoutを使用して非同期にするバージョンです。


var myService = { 
    doMyJob: function(params, cb){ 
    setTimeout(function(){ 
     return cb(); 
    }, 50); 
    } 
}; 

function sample(a, b) { 

    var params = { 
     a: a, 
     b: b 
    }; 

    myService.doMyJob(params, function(err, response) { 
     if (err) { throw err; } 

     //access params.a and params.b 
     console.log(params.a, params.b); 
    }); 
} 

for (var i = 0; i <= 3; i++){ 
    sample("a" + i, "b" + i); 
} 

どのようにして間違った値のparamsになっているのかわかりません。このサンプルコードでは表現されていないコードが他にありますか?

問題を正確に再現するサンプルコードを提供できますか?

+0

最初の反復では、params.a = 1とparams.b = 2と仮定します。 2回目の反復では、params.a = 3とparams.b = 4と仮定します。サンプル(a、b)は、forループ内で呼び出されます。 myService.doMyJobへの呼び出しが収集され、forループが終了すると返されます。この時点で、params.aとparams.bには最新の値があります。どのように私はこれを解決するのですか?コールバック内の関数呼び出しの対応するparams.aとparams.bの値が必要です。 –

+0

どうしたのか分かりません...コードサンプルを更新してループを使用し、非同期にするようにしました。問題を再現する完全な実例を提供できますか? –

関連する問題