NodeJS:串行编写多个API调用的好方法

时间:2017-02-19 18:22:01

标签: javascript node.js api asynchronous

是否有更好/更漂亮的方式来调用多个API(串行),如我的示例所示?

  var request = require('request');

  request('http://www.test.com/api1', function (error, response, body) {
    if (!error && response.statusCode == 200) {

      request('http://www.test.com/api1', function (error, response, body) {
        if (!error && response.statusCode == 200) {

          request('http://www.test.com/api1', function (error, response, body) {
            if (!error && response.statusCode == 200) {

              //And so on...

            }
          })

        }
      })

    }
  })

5 个答案:

答案 0 :(得分:3)

根据您使用的节点版本,承诺应该是原生的......

https://nodejs.org/en/blog/release/v4.0.0/

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

var request = require('request');

getRequest('http://www.test.com/api1').then(function (body1) {
    // do something with body1
    return getRequest('http://www.test.com/api2');
}).then(function (body2) {
    // do something with body2
    return getRequest('http://www.test.com/api3');
}).then(function (body3) {
    // do something with body3
    //And so on...
});

function getRequest(url) {
    return new Promise(function (success, failure) {
        request(url, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                success(body);
            } else {
                failure(error);
            }
        });
    });
}

答案 1 :(得分:2)

使用async.series 如果您想对一组网址执行相同的操作,请使用async.map

承诺也可以像其他建议一样使用。

如果您是异步编程新手,我建议您先从async模块开始,然后在您更清楚地了解之后转到Promise(或coroutinesasync/await)。

示例:

var request = require('request');

async.series([
  function(callback) {
    request('http://www.test.com/api1', function(error, response, body) {
      if (!error && response.statusCode == 200) {
        return callback(null, response);
      }
      return callback(error || new Error('Response non-200'));
    }
  },
  function(callback) {
    request('http://www.test.com/api2', function(error, response, body) {
      if (!error && response.statusCode == 200) {
        return callback(null, response);
      }
      return callback(error || new Error('Response non-200'));
    }
  }
],
// optional callback
function(err, results) {
  if (err) {
    // Handle or return error
  }
  // results is now array of responses
});

答案 2 :(得分:0)

使用Promises。

https://www.promisejs.org
https://www.promisejs.org/patterns/

它比回调更好,它可以连续执行一个接一个的请求。

答案 3 :(得分:0)

您可以使用request-promise代替request,然后就可以将所有承诺链接起来!

https://github.com/request/request-promise

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

rp(options)
.then(function (body) {
   return rp(...)
}).then(()){
   ...
}

在我的诚实意见中,如果订单不重要,您应该并行执行所有请求!

答案 4 :(得分:0)

您可能需要考虑使用JavaScript Promises。他们确实提供more beautiful方式来处理回调。