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
(或coroutines
,async/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 调用的好方法的主要内容,如果未能解决你的问题,请参考以下文章