2016-04-12 10 views
0

私は、オブジェクトの配列として定義されたタスクを持っています。 getHbaseAllCountriesは、すべての国コードを変数selectedCountriesに格納しようとしている配列として返します。データを取得するにはvar selectedCountries []getComponentsGraphDataに渡します。しかし、私がconsole.log(selectedCountries)を呼び出すと、コールバックを追加しても空の配列[]が得られます。javascriptでasyncメソッドから別のasyncメソッドに返された値を送信するにはどうすればよいですか?

var tasks = [{ 
    func: 'getHbaseAllCountries', 
    options: options 
}]; 
var results = []; 
var selectedCountries= []; 
async.forEach(tasks, function(value, callback) { 
    if(value["func"] === 'getHbaseAllCountries') { 
     cmodel.getHbaseAllCountries(value["options"],function(err, values) { 
      if (err) { 
       v.send(err); 
       return; 
      } 
      for(var index=0; index< values.length; index++){ 
       selectedCountries.push(values[index].key); 
      } 
      console.log(selectedCountries);// prints the desired results 
      callback(err,values); 
     }); 
    } 
    console.log(selectedCountries);// prints [] 
    cmodel.getComponentsGraphData(type, selectedCountries, value["country"], value["model"], function(err, data) { 
     //console.log("Data for: " + JSON.stringify(value)); 
      results.push({ 
      _id: value["key"], 
      data: data 
     }); 
     callback(err, data); 
    }); 
}, function(err) { 
    if (err) { 
     v.send(err); 
     return; 
    } 
    v.send(results); 
}); 
+0

「コールバック」ではなく「約束」を使用することをお勧めします。問題を解決する約束を単純に連鎖させることができます。 – Matthijs

+0

'getComponentsGraphData'を' getHbaseAllCountries'コールバックに動かすと動作します。しかし、あなたはそれをしない理由があると思います。そうですか? –

+0

@ Pierre-私はあなたが提案したのと同じことをしました。うまくいった! – ShridharBavannawar

答えて

0

あなたはgetComponentsGraphDataを呼び出すが、あなたのリクエストgetHbaseAllCountriesが終了している場合、あなたは知りません。コメントに示唆されているように、getComponentsGraphDataのコールを移動する必要があります。また、連鎖約束の使用はより良いでしょう。

+0

はい 'getComponentGraphsData'を' getHbaseAllCountries'に移動しました。うまくいきました! – ShridharBavannawar

+0

偉大な、その答えを受け入れてください=) – Groben

関連する問題