【问题标题】:Array in javascript not returning values [duplicate]javascript中的数组不返回值[重复]
【发布时间】:2014-06-20 14:41:04
【问题描述】:
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)
}

在上面的代码中如果日志。函数(数据)中的 results.length 我得到的结果为 1,但是当我在 performrequest 之外记录值时,我得到的值为 0 我想将整个数组结果的值返回给另一个函数 请注意,perform request 是一种从 rest api 位置调用 json 数据的方法,位置长度为 4

【问题讨论】:

  • 您注意到您的console.log(results.length) 出现在第一位了吗?
  • 我从来没有理解过,异步请求/操作/函数是,异步的。

标签: javascript arrays node.js function closures


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2016-06-29
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多