2017-04-08 36 views
0

我得到一個問題,如果我嘗試多次使用請求,它不起作用。我可以舉一個例子:Node JS:我如何從不同的網站請求多個源代碼?

request('https://www.google.com', function (error, response, vBody1) { 
    request('https://www.purple.com', function (error, response, vBody2) { 
     request('https://www.stackoverflow.com', function (error, response, vBody3) { 
      console.log(vBody3); 
     }); 
     console.log(vBody2); 
    }); 
    console.log(vBody1); 
}); 

它讀取並輸出第一個站點的主體,但不是接下來的兩個。 下面是另一個例子:

vSites = ['https://www.google.com','https://www.purple.com','https://www.stackoverflow.com']; 
for (i = 0; i < vSites.length; i++){ 
    request(vSites[i], function (error, response, vBody[i]) { 
     console.log(vBody[i]); 
    }); 
} 

這一個看起來比較清爽,我想這個版本,但它並沒有在所有的工作。我究竟做錯了什麼?

回答

1

除了正確的解決方案,從Michael's reply,請注意for循環發送並行請求。如果您想要執行的操作超過console.log,則數據和錯誤處理可能會遇到挑戰。

爲了更好地處理請求,我建議使用異步控制庫,如asyncbluebird。相比之下,async更容易理解,而bluebird提供更好的代碼可讀性。

下面是一個例子async實現:

var async = require('async'); 
var request = require('request'); 

var vSites = ['https://www.google.com', 'http://www.purple.com','https://www.stackoverflow.com']; 
async.map(
    vSites, 
    // `async` will call this function for each `vSite` 
    function(vSite, next) { 
    // Reuse the code inside your for-loop, but call `next` to pass the error and result to the final callback 
    request(vSite, function(err, response, vBody) { 
     next(err, vBody); 
    }); 
    }, 
    // The final callback will be executed when all requests are completed or either of them fails 
    function(err, results) { 
    console.log(err); 
    console.log(results); 
    } 
); 

希望這有助於:)

2

在您的循環版本中,您不需要vBody變量上的索引。

var request = require('request'); 
vSites = ['https://www.google.com','https://www.purple.com','https://www.stackoverflow.com']; 
for (i = 0; i < vSites.length; i++){ 
     request(vSites[i], function (error, response, vBody) { 
     console.log(vBody); 
    }); 
    } 

此代碼工作正常,我在節點V4.3.2

相關問題