我正在点击一个返回游戏中所有杀戮细节的API,第一个端点返回一个id到kill事件,然后命中第二个端点来检索杀手并杀死名字。
由于这个API的设置方式,我需要首先获取事件ID,然后等待返回数组中的所有id获取结果,然后处理整个kill数组:
requestify.get(url).then(function (response) {
var events = [];
if (response.body && response.body.length > 0) {
data = JSON.parse(response.body);
if (data.hasOwnProperty('events')) {
events = data.events.map(function(event) {
return this.getDataForHeroKillId(event.id, function(killInfo) {
return { killer: killInfo.killer, killed: killInfo.killed, timestamp: event.time };
});
}.bind(this));
console.log('events is: ', events);
}
}
return Promise.all(events);
}.bind(this));
我的getKillInformation函数如下所示:
KillFeed.prototype.getKillInformation = function(id, cb) {
var data = null;
requestify.get(url).then(function (response) {
var event = {};
if (response.body && response.body.length > 0) {
data = JSON.parse(response.body);
if (data.hasOwnProperty('Killer')) {
event = { killer: data.Killer, killed: data.Killed};
}
}
cb(event);
});
};
在第二种方法中,我希望我可以回调每个子请求的结果,然后一旦它们全部被执行,我的新数组将保存数据。但是由于JS的事件驱动特性,我发现我的代码块继续返回一个空事件数组,因为这个代码显然是非阻塞的(可以理解为阻塞事件队列,同时发出HTTP请求并不理想)。我该如何实现呢?
答案 0 :(得分:1)
其中一个使用promises。
requestify.get(url).then(function (response) {
var events = [];
if (response.body && response.body.length > 0) {
var data = JSON.parse(response.body);
if (data.hasOwnProperty('events')) {
// Trying to process the kill information here
events = data.events.map(function(event) {
return this.getKillInformation(event.id).then(function(killInfo) {
return { killer: killInfo.killer, killed: killInfo.killed, timestamp: event['time1'] };
});
}.bind(this));
}
}
return Promise.all(events);
});
KillFeed.prototype.getKillInformation = function(id) {
var url = 'internal_url';
return requestify.get(url).then(function (response) {
if (response.body && response.body.length > 0) {
var data = JSON.parse(response.body);
if (data.hasOwnProperty('killer')) {
return { killer: data.Killer, killed: data.Killed };
}
}
});
};
答案 1 :(得分:0)
您可以使用async及其瀑布方法。 Async是一个NodeJS模块,但它也可以在浏览器中使用。