Вы должны обернуть свой код внутри 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);
}
Однако есть лучшие решения, но они немного сложнее.
Возможный дубликат [Закрытие внутренних циклов JavaScript - простой практический пример] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) –