【问题标题】:NodeJS: Good way to write Multiple API Calls in serialNodeJS:串行编写多个 API 调用的好方法
【发布时间】:2017-07-08 22:26:44
【问题描述】:

有没有更好/更漂亮的方式来调用多个 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...

            }
          })

        }
      })

    }
  })

【问题讨论】:

  • 写真实案例..我们会帮助你

标签: javascript node.js api asynchronous


【解决方案1】:

使用async.series 如果要对一组 URL 执行相同的操作,请使用 async.map

Promise 也可以按照其他人的建议使用。

如果您是异步编程的新手,我建议您先从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
});

【讨论】:

  • 这很好用!使用 async.parallel 而不是 async.series 进行并行调用,这也可以正常工作
【解决方案2】:

使用承诺。

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

它比回调要好得多,它可以串行执行一个又一个请求。

【讨论】:

    【解决方案3】:

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

    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);
                }
            });
        });
    }
    

    【讨论】:

    • 感谢您提供的好例子!我已经设法用我的其他 api 实现了这一点。但是我在将我的功能移交给我的承诺生成器功能时遇到了问题。也许你可以看看? stackoverflow.com/questions/42349936/…
    【解决方案4】:

    您可以使用request-promise 而不是request,然后您就可以链接所有的承诺!

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

    var rp = require('request-promise');
    
    rp(options)
    .then(function (body) {
       return rp(...)
    }).then(()){
       ...
    }
    

    老实说,如果顺序不重要,您应该并行执行所有请求!

    【讨论】:

    • 此库已弃用,请考虑改用 Promises。
    • 现在,有更多的选择,比如 axios 或 fetch :)
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      • 2019-08-01
      • 2022-11-05
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多