私は、オブジェクトの配列として定義されたタスクを持っています。 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);
});
「コールバック」ではなく「約束」を使用することをお勧めします。問題を解決する約束を単純に連鎖させることができます。 – Matthijs
'getComponentsGraphData'を' getHbaseAllCountries'コールバックに動かすと動作します。しかし、あなたはそれをしない理由があると思います。そうですか? –
@ Pierre-私はあなたが提案したのと同じことをしました。うまくいった! – ShridharBavannawar