是否有更好/更漂亮的方式来调用多个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...
}
})
}
})
}
})
答案 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
(或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
});
答案 2 :(得分:0)
答案 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
方式来处理回调。