for循环在node.js中每次都返回相同的值

我一直试图让这个工作,但我似乎不明白为什么它不输出正确的信息。 我在控制台中得到的是“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中,以使你的variables保持不变。

 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()的callback不会立即被触发,因此当它被调用时,会得到“current i”,即6。

有两个简单的解决scheme可以按顺序触发请求callback。

第一个解决scheme – 相互调用请求。

 (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); } 

虽然有更好的解决scheme,但是它们有点复杂。