2016-05-08 92 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