2016-05-08 25 views
1

我一直试图让这个工作,但我似乎不明白为什么它不输出正确的信息。 我在控制台得到的是“页面:6” 5次,但我要的是第1页第2页第3页第4页,第5页。for循环node.js每次返回相同的值

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); 
     } 
    }); 
} 
+2

[JavaScript闭合内循环 - 简单实用示例]可能的重复(http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) –

回答

3

您应该会在一个包裹你的代码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); 
} 

“问题”与您当前的代码是传递到请求()回调不发射瞬间,因此当它被调用时,它得到了“目前我”,这是6

有两个简单的解决方案可以按顺序请求回调。

第一种解决方案 - 相互调用请求。

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

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

+0

感谢您的解释!是否有console.log('page:'+ i)不按顺序的原因?我得到的输出会随时变化,它会输出1到5之间的所有数字,但不会按顺序输出。 – KujAslani

+0

这取决于功能何时被触发。没有顺序,当循环结束时触发,你很可能得到6.如果你想要指定“i”,你必须把它包装在这个函数中。 –

+0

不知道我是否足够好地解释了自己,但我似乎没有完全理解你的回答。我现在正在使用你的代码片段,它的工作原理,我得到我正在寻找的输出,除了它不是按顺序。有没有办法让它按顺序?而不是随机顺序,我希望它是1,2,3,4等。 – KujAslani