在父http请求中完成所有子http请求后,如何返回

时间:2016-08-01 13:08:37

标签: javascript asynchronous

我正在点击一个返回游戏中所有杀戮细节的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请求并不理想)。我该如何实现呢?

2 个答案:

答案 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模块,但它也可以在浏览器中使用。