Javascript $.getJSON和节点异步返回的值不正确-服务器端节点/express jsonp

Javascript $.getJSON和节点异步返回的值不正确-服务器端节点/express jsonp,javascript,jquery,asynchronous,node-async,Javascript,Jquery,Asynchronous,Node Async,当使用$.getJSON与运行node/express和jsonp响应的服务器进行节点异步时,我遇到了一个奇怪的错误 我使用node async对一个数组进行迭代,对服务器进行两次调用,但当所有操作完成后,第二个结果具有一些属性,其中包含第一个结果的值 奇怪的是,服务器端响应正在返回—返回的一个属性是正确的—但另一个属性看起来在第二次调用时被第一次调用的属性覆盖 在服务器端,我对其进行了调试并检查了res.jsonp行,该行返回了正确的结果,我还使用一些控制台日志服务器端对其进行了检查 以下代码

当使用$.getJSON与运行node/express和jsonp响应的服务器进行节点异步时,我遇到了一个奇怪的错误

我使用node async对一个数组进行迭代,对服务器进行两次调用,但当所有操作完成后,第二个结果具有一些属性,其中包含第一个结果的值

奇怪的是,服务器端响应正在返回—返回的一个属性是正确的—但另一个属性看起来在第二次调用时被第一次调用的属性覆盖

在服务器端,我对其进行了调试并检查了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]}
    ]
下面是代码的简化版本(去掉了很多垃圾,但逻辑保持不变):

我用async series、async parallel以及promise样式的getJSON和回调样式的getJSON进行了尝试——都显示了相同的错误

可能是我的客户端代码,也可能是我对服务器端jsonp做了一些傻事

服务器端,我构建数据,然后执行

return res.jsonp(output);

有什么想法吗?

我必须承认,我发现你的代码没有任何问题。为了用尽所有的选择,也许你可以试试

var系列=[
{id:1},
{id:2}
]
//从服务器获取数据并返回数据的函数
函数getData(id,cb)
{
var url=serverUrl+“/GetSomeData/”+id;
$.getJSON(url)
.done(函数(服务器响应)
{
log(“来自服务器的响应:”,serverResponse);
cb({“series”:id,options:serverResponse.options,data:serverResponse.data});
});
}
//使用async.forEach遍历系列的函数
函数迭代器,回调函数
{
getData(s.id,函数(数据)
{
//告诉async将数据添加到结果列表中
//然后继续下一次迭代。
回调(null,data);//err=null
});
}
功能完成(错误、结果)
{
控制台日志(“完成”);
}
//请注意,map没有按顺序执行迭代器,但结果列表是按顺序执行的。

map(系列、迭代器、完成)Doh。看起来我被一个外部函数调用抓到了,它严重破坏了chrome inspector

我最终意识到chrome控制台没有在inspector中显示有效的数据,但是如果我使用JSON.stringify正确显示对象

例如

将为不正确的对象提供树状视图,如下所示:

{"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
--

原因是什么?我用这些数据做了些什么。我从示例中删除的一条“垃圾取出”行是调用highcharts图表来设置序列数据——沿着

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 inspector


我猜节点async+$.getJSON+多个函数+回调的作用域是地狱,这是最后一根稻草。算了吧

我至少可以看到三个独立的变量,都称为“数据”。我要做的第一件事是为它们找到不同的名称。很好的一点是,我已经完成并更改了它们,但没有任何改进,我将继续尝试。在“完成”函数中,您可能会吞下一个可能会说点什么的错误。请添加以下行:if(err)console.log(err);好主意,尝试了async.map,但结果相同。立即检查控制台上的JSON响应,在正确离开服务器后,它们会像所描述的那样混合在一起。下一步是重写,将异步从等式中去掉。
{"series":2, options:{serverSays:"Here is series 2"}, data: [x:9, y:8, z:7]} //Correct data property
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
});