for (var i in locations) {
performRequest(options, function (data) {
console.log("Got response: " + i + " " + options.host);
results.push(data.current_observation);
// return results;
});
console.log(results.length)
}
在上面的代码中如果是日志。结果。在函数中的长度(数据)我得到的结果为1,但是当我在performrequest之外记录值时,我得到的值为0我想将整个数组结果的值返回给另一个函数 请注意,执行请求是一种从静止api位置调用json数据的方法是4
答案 0 :(得分:0)
AJAX中的“异步”部分意味着,在您的情况下,传递给performRequest的结果处理函数的执行不会阻止程序流的其余部分。一旦HTTP响应从服务器返回您的请求,它就会被执行。
这也是为什么你不知道什么时候会完全执行console.log(results.length)的原因。它很可能在结果处理函数之前执行大部分时间:结果处理函数依赖于HTTP请求完成并异步执行,而console.log(results.length);没有。
当您想循环遍历集合并且对于每个项目同步执行AJAX请求时,您可以从结果处理程序中调用下一个项目的执行。一个简单的基于JQuery的例子可能是:
var values = [1, 2, 3, 4, 5];
var count = 0;
var i = -1;
function next() {
if(i>=values.length) return;
i++;
$.get("http://www.example.com/result/" + i, function(data) {
// do something with your data.
// notice that at this point you can be sure your asynchronous request
// was completed and the data definitely is available (or definitely
// is unavailable). So you could for example start counting stuff here:
count++;
// now that you definitely know that the request is done (successfully or
// not), you can go ahead with the next one.
next();
});
}
这个例子有一些缺陷,例如,当你使用大量的值和短的响应时间时,它只会人为地减慢一切。