javascript中的数组不返回值

时间:2014-05-04 05:54:09

标签: javascript arrays node.js function closures

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

1 个答案:

答案 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();
    });
}

这个例子有一些缺陷,例如,当你使用大量的值和短的响应时间时,它只会人为地减慢一切。