node-async で $.getJSON を使用して、jsonp 応答で node/express を実行しているサーバーにすると、奇妙なエラーが発生します。
node-async を使用して配列を反復処理してサーバーに 2 つの呼び出しを行いますが、すべてが完了すると、2 番目の結果には最初の値を含むいくつかのプロパティが含まれます。
奇妙なことに、返されたプロパティの 1 つが正しいため、サーバー側の応答が返されますが、別のプロパティは、最初のプロパティによって 2 回目の呼び出しで上書きされるように見えます。
サーバー側では、私はそれをデバッグし、正しい結果を返している res.jsonp 行を確認しました。また、サーバー側のコンソール ログでも確認しました。
以下のコード - TLDR の結果は次のとおりです。
//Expecting results to be:
[
{"series":1, options:{serverSays:"Here is series 1"},data: [a:1,b:2,c:3]},
{"series":2, options:{serverSays:"Here is series 2"}, data: [x:9, y:8, z:7]}
]
//Actual Results are
[
{"series":1, options:{serverSays:"Here is series 1"}, data: [a:1,b:2,c:3]},
{"series":2, options:{serverSays:"Here is series 2"}, data: [a:1,b:2,c:3]}
]
以下はコードの単純化されたバージョンです (多くのがらくたが取り除かれていますが、ロジックはそのまま残っています):
var series = [
{id: 1},
{id: 2}
]
var results = [];
//A function to get data from the server and return it
function getData(id, cb)
{
var url = serverUrl + "/GetSomeData/" + id;
$.getJSON(url)
.done(function (serverResponse)
{
console.log("Response from server: ", serverResponse)
cb({"series": id, options: serverResponse.options, data: serverResponse.data});
}
}
//A function to iterate through the series using async.forEach
function iterator(s, callback)
{
getData(s.id, function(data)
{
//Use the data
results.push(data);
//Tell async we are done with this iteration
callback()
});
}
function done(err)
{
console.log("Finished");
//Expecting results to be
//[
// {"series":1, options:{serverSays:"You Requested Series 1"},data: [a:1,b:2,c:3]},
// {"series":2, options:{serverSays:"You Requested Series 2"}, data: [x:9, y:8, z:7]}
//]
//Actual Results are
//[
// {"series":1, options:{serverSays:"You Requested Series 1"}, data: [a:1,b:2,c:3]},
// {"series":2, options:{serverSays:"You Requested Series 2"}, data: [a:1,b:2,c:3]}
//]
}
async.eachSeries(series, iterator, done);
非同期シリーズ、非同期並列、およびプロミス スタイルの getJSON とコールバック スタイルの getJSON で試しましたが、すべて同じエラーが表示されます。
私のクライアント側のコードかもしれませんし、サーバー側のjsonpで何かばかげたことをしているのかもしれません。
サーバー側では、データを構築してから進みます
return res.jsonp(output);
何かご意見は?