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

Posted

技术标签:

【中文标题】NodeJS:串行编写多个 API 调用的好方法【英文标题】:NodeJS: Good way to write Multiple API Calls in serial 【发布时间】: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...

            
          )

        
      )

    
  )

【问题讨论】:

写真实案例..我们会帮助你 【参考方案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.orghttps://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 实现了这一点。但是我在将我的功能移交给我的承诺生成器功能时遇到了问题。也许你可以看看? ***.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 处理回调的方式。

【讨论】:

以上是关于NodeJS:串行编写多个 API 调用的好方法的主要内容,如果未能解决你的问题,请参考以下文章

nodejs api调用没有响应

nodejs-在函数内执行多个异步调用的最佳方法?

使用异步和请求包(NodeJS / Express)进行多个 API 调用

使用 Haskell 编写自己的区块链

什么是延迟api调用的好方法?

编写一个类是从 graphql API 响应返回的 JSON 对象创建变量集合的好方法吗?