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

时间:2016-05-08 19:21:13

标签: javascript node.js vimeo-api

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

1 个答案:

答案 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);
}

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