2017-03-08 159 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); 
    }); 

    });