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

标签 javascript node.js vimeo-api

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

相关文章:

Javascript 客户端 JPEG 图像压缩

javascript - 如何在此 jQuery 代码中添加变量?

javascript - 如何将 iframe vimeo 静音

vimeo - 通过 SSL 获取 vimeo 缩略图

android - 在 Android VideoView 中播放 Vimeo 视频

javascript - 使用 Jquery 编辑类

javascript - 对于 'non-singlepage' 前端应用程序,我应该在哪里存储我的 JSON Web token

node.js - 如何永久安装 MEAN.io 包

node.js - 使用 socket.io 流式传输网络摄像头

node.js - 无法理解 fs.stat() 的工作原理