0

我很困惑为什么在第一个 console.log 下面的代码中向我显示了对象,而第二个是未定义的。我该如何解决这个问题?

var listOfTweets = [];

for(var k = 0; k < search.length; k++){
    $.getJSON(searchURL, function(tweets){                              
        listOfTweets[k] = tweets;
        console.log(listOfTweets[k]);                               
    });
    console.log(listOfTweets[k]);
}
4

4 回答 4

6

getJSON 是异步执行的,最后一个 console.log 在分配之前执行

因为我不知道你真正想要什么,所以很难告诉你应该做什么。您需要记住的是执行顺序。

在这段代码中

 $.getJSON(searchURL, function(tweets){
          console.log("done");
    });
    console.log("Request send");

发生的第一件事是发送一个请求,searchURL然后接下来的事情是“请求发送”将被打印到控制台,当浏览器收到对请求的响应时,很快就会调用该函数并且“完成”将打印到控制台

此外,您的代码在关闭方面存在问题,因为 k 已关闭,并且对于回调的所有调用将具有相同的值 (1)

要解决该问题,您可以使用自执行功能

for(var k = 0;k<10;k++){
    $.getJSON(searchURL, (function(i){
          return function(tweets){  
                         console.log("done for " + i);
                 }
     }(k));
    console.log("Request send for " + k);
 }

请注意,k 立即用作函数的参数,参数的值被存储以供函数返回作为回调引用,并且在 k 增加时不会改变。如果你像你一样做,那么因为所有回调都引用同一个对象,所以它们也都具有相同的 k 值

(1) 除非在循环结束前返回一些

于 2012-05-30T18:07:08.800 回答
3

所有 $.getJSON 调用都是异步发生的。您最后的“console.log”可能会在“任何 getJSON 调用完成之前”被调用。

于 2012-05-30T18:09:16.797 回答
1

尝试按如下方式保存 k:

var listOfTweets = [];

for(var k = 0; k < search.length; k++){
    $.getJSON(searchURL, function(tweets){    
        var kk = k; // saved!!                          
        listOfTweets[kk] = tweets;
        console.log(listOfTweets[kk]);                               
    });
    console.log(listOfTweets[k]);
}

因此,当k增加时,它不会影响kk您保存的

于 2012-05-30T18:12:09.077 回答
1

您将需要一个闭包来将 的当前值保存k到回调的范围内。否则,k等于search.length执行回调时的循环之后。另外,请参阅Javascript Callback Timing了解何时可以使用填充的listOfTweets.

var listOfTweets = [];
var search = [url1, url2, ...];

$.each(search, function(k, searchURL) {
    $.getJSON(searchURL, function(tweets){                              
        console.log(listOfTweets[k] = tweets);         
    });
});

// After all the ajax request completed, you will be able to
console.log(listOfTweets);
于 2012-05-30T18:24:40.413 回答