我一直在努力让它工作,但我似乎不明白为什么它没有输出正确的信息。 我在控制台中得到的是“page: 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);
}
});
}
最佳答案
您应该将您的代码包装在一个 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);
}
虽然有更好的解决方案,但它们有点复杂。
关于javascript - node.js 中的 for 循环每次都返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37103897/