2016-05-08 6 views
1

Я пытался заставить это работать, но, похоже, я не понимаю, почему он не выводит правильную информацию. что я получаю в консоли «страница: 6» в 5 раз, но то, что я хочу, страница 1, страница 2, страница 3, стр 4, стр 5.для loop в node.js возвращает одинаковое значение каждый раз

for (var i = 1; i <= 5; i++) { 
    lib.request({ 
     path: '/channels/staffpicks/videos', 
     query: { 
      page: i, 
      per_page: 50 
     } 
    }, function (error, body, status_code, headers) { 
     if (error) { 
      console.log('error'); 
      console.log(error); 
     } else { 
      var totalbody = body.total; 
      console.log('page: ' + i); 
     } 
    }); 
} 
+2

Возможный дубликат [Закрытие внутренних циклов JavaScript - простой практический пример] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) –

ответ

3

Вы должны обернуть свой код внутри IIFE, чтобы ваша переменная сохранялась.

for (var i = 1; i <= 5; i++) { 
    (function(i) { 
    lib.request({ 
     path: '/channels/staffpicks/videos', 
     query: { 
     page: i, 
     per_page: 50 
     } 
    }, function (error, body, status_code, headers) { 
     if (error) { 
     console.log('error'); 
     console.log(error); 
     } else { 
     var totalbody = body.total; 
     console.log('page: ' + i); 
     } 
    }); 
})(i); 
} 

«Проблема» с текущим кодом является то, что обратный вызов передается запрос() не уволил сразу, поэтому, когда она вызывается, она получает «ток», который является 6.

Существует 2 простых решения, чтобы иметь обратные вызовы запросов в порядке.

Первое решение - вызов запроса после друг друга.

(function request(i) { 
lib.request({ 
    path: '/channels/staffpicks/videos', 
    query: { 
    page: i, 
    per_page: 50 
    } 
}, function (error, body, status_code, headers) { 
    if (error) { 
    console.log('error'); 
    console.log(error); 
    } else { 
    var totalbody = body.total; 
    console.log('page: ' + i); 
    } 
    request(++i); 
}); 
})(0); 

Второй - немного более продвинутый, но также и лучший, поскольку запросы выполняются в одно и то же время.

var amount = 5, 
    fetched = 0, 
    results = new Array(amount); 
for (var i = 1; i <= amount; i++) { 
(function(i) { 
    lib.request({ 
     path: '/channels/staffpicks/videos', 
     query: { 
     page: i, 
     per_page: 50 
     } 
    }, function (error, body, status_code, headers) { 
     fetched++; 
     if (error) { 
     console.log('error'); 
     console.log(error); 
     results[i] = "error"; 
     } else { 
     results[i] = body; 
     var totalbody = body.total; 
     } 
     if (fetched === amount) { 
     results.forEach(function(body, n) { 
      console.log('page: ' + n); 
     }); 
     } 
    }); 
})(i); 
} 

Однако есть лучшие решения, но они немного сложнее.

+0

Спасибо за объяснение! Есть ли причина, по которой console.log ('page:' + i) не подходит? выходы, которые я получаю, время от времени меняются, выводятся все числа от 1 до 5, но не в порядке. – KujAslani

+0

Это зависит от того, когда функция запускается. Нет порядка, когда он срабатывает, когда цикл завершен, вы, скорее всего, получите 6. Если вы хотите, чтобы «i» указано, вы должны обернуть его в такую ​​функцию. –

+0

Не уверен, что я достаточно хорошо себя объяснил, но, похоже, я не полностью понимаю ваш ответ. Теперь я использую ваш фрагмент кода, и он работает, я получаю вывод, который я искал, за исключением того, что он не в порядке. Есть ли способ привести его в порядок? вместо случайного порядка я хочу, чтобы он был 1,2,3,4 и т. д. – KujAslani

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

  • Нет связанных вопросов^_^