for loop in node.js returns 每次都相同的值

for loop in node.js returns same value every time

我一直在努力让它工作,但我似乎不明白为什么它没有输出正确的信息。 我在控制台得到的是"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);
}

您当前代码的 "problem" 是传递给 request() 的回调不会立即触发,因此当它被调用时,它会得到 "current 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);
}

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