试图激发多个请求的拍打api,使用蓝知更鸟以及考拉发电机。
在阅读了一些文档之后,我认为下面的内容会起作用
var request = require('co-request'),
_ = require('lodash'),
Promise = require('bluebird');
request = Promise.promisifyAll(request);
module.exports.getTracks = function *tracks(){
firstCall = yield makeAPICall('users/' + me + '/mymusic/tracks?limit=150');
total = firstCall.body.info.total;
total -= 150;
tracks = firstCall.body.data;
//Beats only allows a maximum of 150 tracks per call
//If more tracks are needed then the remainder is called in sets of 150
var offset = 150;
while (total > 0) {
promises.push(makeAPICall('users/' + me + '/mymusic/tracks?limit=150&offset=' + offset));
offset += 150;
total -= 150;
}
var responses = yield(Promise.all(promises));
}
function makeAPICall (query){
var authOptions = {
url: 'https://partner.api.beatsmusic.com/v1/api/' + query,
headers: { 'Authorization': 'Bearer ' + accessToken },
json: true
};
return request.get(authOptions);
}makeAPI调用方法的工作方式与firstCall预期的一样,但由于某种原因,当我开始将makeAPICall方法放置到数组中时,它们似乎从未执行过。变量响应只产生一个函数数组,而不是来自beats的一系列响应。要使响应返回类似于firstCall的对象数组,需要更改什么?
发布于 2015-03-09 16:11:28
您使用的共同请求已经将回调转换为块,因此不需要尝试和促进事情。
下面是一个简化的可运行示例,类似于您的代码,演示了如何与Koa并行运行api调用(Koa在外壳下使用co )。
当您生成一个数组时,co将并行运行任何块/许诺/生成器等。
var request = require('co-request'),
co = require('co');
co(function *(){
var results = yield getTracks();
results.forEach(function(result){
console.log(result.body);
})
}).then();
function * getTracks () {
var queries = [];
// swap out your queries here
queries.push(makeAPICall('5185415ba171ea3a00704eed'));
queries.push(makeAPICall('54fdc3c9862a3aab01dc95cf'));
queries.push(makeAPICall('54fdc3da862a3aa501dc95d0'));
// yielding an array returns an array of results
var results = yield queries;
return results;
}
function makeAPICall (query) {
var options = {
url: 'http://www.mocky.io/v2/' + query,
json: true
}
return request.get(options)
}https://stackoverflow.com/questions/28936205
复制相似问题