2017-03-08 194 views
0

我想處理多個承諾,在下面的例子中,kouta API返回多個網站,然後我想循環訪問網站以逐個獲取類別。在for循環中處理多個承諾與錯誤處理

節點代碼:

request({ 
     url: 'https://cbatest.kounta.com/v1/companies/20155/sites.json', 
     headers: header_data, 
     json: requestData, 
     method: 'GET', 
    }, function (err, response, body) { 
     var site_list = body; 
     //res.send(site_list); 
     var promises = []; 
     for (let i = 0; i < site_list.length; i++) { 
      var cat_list = new Promise(function (resolve, reject) { 
       var site_id = site_list[i].id; 
       var category_arr = []; 
       request({ 
        url: 'https://cbatest.kounta.com/v1/companies/20155/sites/' + site_id + '/categories.json', 
        headers: header_data, 
        json: requestData, 
        method: 'GET', 
       }, function (err, response, body) { 
        var category_list = body; 
        resolve(category_list); 
       }); 
      }); 
      cat_list.then(function (result) { 
       promises.push(result); 
       console.log(promises); 
       res.send(promises) 
      }).catch(function (err) { 
       console.log(err); 
      }) 
     } 
    }); 

問題:的console.log(承諾);只適用於最後一個id,res.send(promises);只工作一次。我錯過了什麼?

在此先感謝。

回答

1

您的代碼僅針對解決的第一個承諾發送結果。

這是更好地從async

使用和代碼變得像:

request({ 
     url: 'https://cbatest.kounta.com/v1/companies/20155/sites.json', 
     headers: header_data, 
     json: requestData, 
     method: 'GET', 
    }, function (err, response, body) { 
     var site_list = body; 
     //res.send(site_list); 
     var promises = []; 

    async.map(site_list, function(site, callback){ 
       request({ 
        url: 'https://cbatest.kounta.com/v1/companies/20155/sites/' + site.id + '/categories.json', 
        headers: header_data, 
        json: requestData, 
        method: 'GET', 
       }, function (err, response, body) { 
        var category_list = body; 
        callback(null, category_list); 
       }); 

    }, function(err, result){ 
     if(err) return res.send(err); 

     //result is array of arrays. you can shape it like you want 
     res.send(result); 
    }); 

    });