我一直试图让这个工作,但我似乎不明白为什么它没有输出正确的信息。 我在控制台得到的是"页面:6" 5次,但我想要的是第1页,第2页,第3页,第4页,第5页。
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);
}
});
}
答案 0 :(得分:5)
您应该将代码包装在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);
}
当前代码的“问题”是传递给request()的回调不会立即触发,因此在调用时,它会得到“当前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);
}
虽然有更好的解决方案,但它们有点复杂。