使用bluebird

时间:2016-03-13 09:43:08

标签: javascript promise bluebird

我正在尝试使用BlueBird转换现有代码,请建议一个链接多个请求的最佳选项。每个回调中发生的错误都需要重定向到呈现不同的错误。

request(option1, function (error, response, body) {
    if (!error && response.statusCode == 200) {
       var data= JSON.parse(body);

       if(data.valid){

           if(data.expired){

               next();
           } else {

               request(option2, function (error2, response2, body2) {
                 var data2= JSON.parse(body2);
                 if(data2.valid) {
                    request(option3, function (error3, response3, body3) {
                        next();
                    })
                 } else {
                    res.json({error:'Error1'});
                 }
               })

          }
        } else {
           res.json({error:'Error2'});
        }
     } else {
        res.json({error:'Error3'});
     }
})

2 个答案:

答案 0 :(得分:1)

这非常简单,同时请注意您当前的代码不处理第二个和第三个请求中的错误,这样做:

var request = require("request-promise"); // request - converted to bluebird

request(option1).then(data=> {
  if(!data.valid) throw Error("Error3");
  if(data.expired) return;
  return request(option2).then(JSON.parse);
}).then(data2 => {
  if(!data2) return; // didn't need to fetch additional data
  if(!data2.valid) throw Error("Error2");
  return request(option3);
}).then(() => {
  next();
}, e => {
  res.json(error: e.message); 
  // better log this. 
});

答案 1 :(得分:0)

var rp = require('request-promise');

function handleError(err) {
  res.json({
    error: err.message
  });
}

function parse(data) {
  if (data) {
    return JSON.parse(data);
  }
}

rp(option1)
  .then(parse)
  .then(function (data) {
    if (!data || !data.valid) {
      throw Error('Error2');
    }
    if (data.expired) {
      return;
    }
    return option2;
  })
  .then(rp)
  .then(parse)
  .then(function (data2) {
    if (!data2 || !data2.valid) {
      throw Error('Error1');
    }
    return option3;
  })
  .then(rp)
  .then(parse)
  .then(function () {
    next();
  })
  .catch(handleError);

您不需要手动检查statusCode,但如果您需要这样做,首先必须将resolveWithFullResponse属性添加到option1对象,这样您就可以接收response对象:

function checkStatusCode(response) {
  if (response.statusCode !== 200) {
    throw Error('Error3');
  }
  return response.body;
}
// add resolveWithFullResponse attribute to option1
option1.resolveWithFullResponse = true;
rp(option1)
  .then(checkStatusCode)
  .then(parse)
  //...