2015-11-01 6 views
1

В моем приложении я загружаю сообщения пользователей, используя функцию прокрутки ajax вниз.setTimeout не работает должным образом

Итерация цикла цикла занимает слишком много времени, браузер зависает до тех пор, пока не будут показаны результаты. Поэтому я применил метод setTimeout, чтобы исправить это, но по какой-то причине поток не входит в метод setTimeout при отладке.

Также страница пуста, данные не отображаются.

success : function(responseJson) { 
     $("#loadingdata").toggle(); 
     enableScrolling(); 

     if($.isEmptyObject(responseJson)){ 
      $("#noMorePosts").toggle(); 
      disableScrolling(); 
      paginationComplete=true; 
     } 

     $.each(responseJson, function (index) {  
      (function(index) { 
      setTimeout(function(index) { //the flow doesn't move inside this 
       var resp_JSON=responseJson[index]; 
       var dateObj=resp_JSON.postCreationTime; 
       resp_JSON.postCreationTime = moment(dateObj).format("h:mm a, ddd, MMM Do YY"); 
       var timeago = moment(dateObj).fromNow(); 
       resp_JSON.timeago = timeago; 
       resp_JSON.username=userName;    
       var post_template = $('#homepostcontainertemplate').html(); 
       Mustache.parse(post_template); 
       var post_info = Mustache.to_html(post_template, resp_JSON); 
       $('#homepublisherpostsdiv').append(post_info); 
       $('div').linkify(); 
      }); 
      })(index); 
     }); 

Когда поток достигает SetTimeout следующего кода он ударяется является JQuery Lib

enter image description here

я делаю это правильно или что-то отсутствует?

Примечание: Я получаю данные ответа от Json с сервера. Без setTimeout данные загружаются на страницу.

+1

'console.log (1)' до первой строки на 'setTimeout' обратного вызова, она печатается в консоли? – Niloct

+0

Я положил его перед setTimeout после (function (index) {; он печатает 1 раз в консоли, но он также говорит, что Uncaught TypeError: Невозможно прочитать свойство postCreationTime не определено 10 раз. Вероятно, код в setTimeout равен не удалось прочитать responseJSON – underdog

+1

Есть ли конкретная причина использования инкапсулированной функции внутри $ .each? Чем она отличается от написания прямого $ .each (responseJson, function (index) {setTimeout (function() {... – jjaulimsing

ответ

5

setTimeout принимает функцию без аргументов (https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout), поэтому наличие index в качестве аргумента немного странно. Я подозреваю, что индекс не определен, поэтому responseJson[index] выбрасывает исключение из привязки (о чем свидетельствует console.log(1), отображающееся в соответствии с комментарием Niloct). Если вы измените свой код на:

$.each(responseJson, function (index) {  
     setTimeout(function() { // no index in the argument list 
      var resp_JSON=responseJson[index]; 
      var dateObj=resp_JSON.postCreationTime; 
      resp_JSON.postCreationTime = moment(dateObj).format("h:mm a, ddd, MMM Do YY"); 
      var timeago = moment(dateObj).fromNow(); 
      resp_JSON.timeago = timeago; 
      resp_JSON.username=userName;    
      var post_template = $('#homepostcontainertemplate').html(); 
      Mustache.parse(post_template); 
      var post_info = Mustache.to_html(post_template, resp_JSON); 
      $('#homepublisherpostsdiv').append(post_info); 
      $('div').linkify(); 
     }); 
    }); 

Я подозреваю, что он сработает.

(отредактированный принять во внимание jjaulimsing в комментарии о не нуждаясь функции герметизирующего.)

+0

работает отлично syaz спасибо – underdog

+0

Привет Сяз, можете ли вы принять запрос на изменение имени пользователя, пожалуйста. Я пытаюсь удалить ссылки из поисковой системы. Заранее спасибо. – jjaulimsing

Смежные вопросы