1

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);

何かご意見は?

4

2 に答える 2

0

認めざるを得ませんが、あなたのコードに問題は見つかりません。すべてのオプションを使い果たすために、async.mapを試すことができますか?

var series = [
  {id: 1},
  {id: 2}
]

//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)
  {
    //Tell async to add data to the result list
    // and continue with the next iteration.
    callback(null, data); // err = null
  });
}

function done(err, result)
{
    console.log("Finished");
}

// Note that map doesn't perform the iterator in order, but the result list is in order.
async.map(series, iterator, done);

開発者ツールのネットワーク タブをチェックして、ブラウザが受信したサーバーからの応答を確認してみましたか?

応答が予想される出力と同じである場合は、おそらく、ここの図には何かが欠けています。

于 2015-04-13T19:08:20.233 に答える
0

ドー。クロムインスペクターをひどく壊す外部関数呼び出しに巻き込まれていたようです!!

Chrome コンソールのインスペクターに有効なデータが表示されていないことに最終的に気付きましたが、オブジェクトを JSON.stringify すると正しく表示されました。

例えば

console.log("Server response is: ", serverResponse) //In the getJSON callback

次のような不適切なオブジェクトのツリー ビューが表示されます。

{"series":2, options:{serverSays:"Here is series 2"}, data: [a:1,b:2,c:3]} //Incorrect data property

しかし、やっている

console.log("Server response is: ", JSON.stringify(serverResponse))

正しいJSONを示しました:

{"series":2, options:{serverSays:"Here is series 2"}, data: [x:9, y:8, z:7]} //Correct data property

--

原因?私がデータで行っていたこと。例から削除した「がらくたを取り出した」行の 1 つは、次の行に沿って、系列データを設定するためのハイチャート チャートの呼び出しでした。

getData(s.id, function(data)
  {

    //THE OMITTED LINE
    chart.series[someSeries].setData(data.data);

    //Tell async to add data to the result list
    // and continue with the next iteration.
    callback(null, data); // err = null
});

これは、チャート定義にあったバグにつまずいていたのですが、正常に失敗する代わりに、どういうわけか chrome インスペクタが壊れてしまいました...!

node-async + $.getJSON + 複数の関数 + コールバックのスコープ地獄で推測していますが、これが最後のストローでした。ゴーフィギュア!

于 2015-04-13T23:17:59.023 に答える