最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - NodeJS: Good way to write Multiple API Calls in serial - Stack Overflow

programmeradmin5浏览0评论

Is there a better/more beautiful way to call multiple APIs after another (in serial) as in my example?

  var request = require('request');

  request('', function (error, response, body) {
    if (!error && response.statusCode == 200) {

      request('', function (error, response, body) {
        if (!error && response.statusCode == 200) {

          request('', function (error, response, body) {
            if (!error && response.statusCode == 200) {

              //And so on...

            }
          })

        }
      })

    }
  })

Is there a better/more beautiful way to call multiple APIs after another (in serial) as in my example?

  var request = require('request');

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

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

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

              //And so on...

            }
          })

        }
      })

    }
  })
Share Improve this question asked Feb 19, 2017 at 18:22 Tilman MarquartTilman Marquart 1151 gold badge1 silver badge9 bronze badges 1
  • Write real case.. we will help you – Abdennour TOUMI Commented Feb 19, 2017 at 18:31
Add a ment  | 

5 Answers 5

Reset to default 5

Depending on which version of node you are using, promises should be native...

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

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

var request = require('request');

getRequest('http://www.test./api1').then(function (body1) {
    // do something with body1
    return getRequest('http://www.test./api2');
}).then(function (body2) {
    // do something with body2
    return getRequest('http://www.test./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);
            }
        });
    });
}

Use async.series If you want to do same operation on a set of URLs, use async.map

Promise can also be used as others suggested.

If you are new with asynchronous programming, I suggest to start with async module then move to Promise (or coroutines, async/await) once you have clearer understanding.

Example:

var request = require('request');

async.series([
  function(callback) {
    request('http://www.test./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./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
});

You can use request-promise instead of request and then you would be able to chain all the promises!

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

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

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

In my honest opinion and if the order is not important you should do all the requests in parallel!

Use Promises.

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

It is much better than callbacks and it can execute one request after another in serial.

You may want to consider using JavaScript Promises. They sure provide a more beautiful way to handle callbacks.

发布评论

评论列表(0)

  1. 暂无评论