在将 $.getJSON 与节点异步一起使用到运行带有 jsonp 响应的节点/express 的服务器时,我遇到了一个奇怪的错误。
我使用节点异步迭代数组对服务器进行了两次调用,但是当所有操作完成后,第二个结果具有一些包含第一个结果中的值的属性。
奇怪的是,服务器端响应正在返回 - 因为返回的属性之一是正确的 - 但另一个属性看起来在第二次调用时被第一次调用的属性覆盖。
在服务器端,我对其进行了调试并检查了返回正确结果的 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);
我已经尝试过异步系列、异步并行以及 promise 样式 getJSON 和回调样式 getJSON - 都显示相同的错误。
可能是我的客户端代码,或者可能我正在对服务器端 jsonp 做一些愚蠢的事情。
服务器端,我构建数据然后继续
return res.jsonp(output);
有什么想法吗?
最佳答案
我必须承认,我找不到您的代码有任何问题。为了穷尽所有选项,也许你可以尝试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);
您是否尝试过检查开发人员工具的网络选项卡以查看浏览器收到的来自服务器的响应?
如果响应与预期输出相同,则此处的图片可能缺少某些内容。
关于javascript - 从 $.getJSON 和节点异步返回不正确 - 服务器端节点/express jsonp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29612451/