2012-05-30 3 views
0

Я смущен, почему в коде ниже первый console.log показывает мне объект, но второй не определен. Как исправить эту проблему?Область применения функций jQuery

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]); 
} 
+1

сделали вы также заметите, что 'k' имеет одинаковое значение во всех функций обратного вызова – Esailija

+0

Да, это просто показать, как я не могу получить доступ к тем же данным внутри .getJSON. – jordaninternets

+0

Сфера не имеет ничего общего с jQuery – Bergi

ответ

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

заметить, что к используется в качестве аргумента для функции IMMEDIATEDLY, значение аргумента сохраняется для справки функцией возврата в качестве обратного вызова и не изменится при увеличении k. Если вы делаете, как вы сделали то, поскольку все обратные вызовы ссылаются на тот же объект все они будут также иметь одинаковое значение для к

(1), если некоторые возвращаются перед сквозным заканчивается

3

Весь $ .getJSON вызовы происходят асинхронно. Последний «console.log», скорее всего, называется «до», даже любой из вызовов getJSON даже выполняется.

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, сохраненный

+0

... только то, что сохранение k в функции обратного вызова не влияет. – Bergi

1

Вам нужно будет замыкание, чтобы сохранить текущее значение k к область обратного вызова. Else, 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); 
Смежные вопросы