簡體   English   中英

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

[英]How can I return once all child http requests complete in a parent http request

我正在點擊一個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請求並不理想)。 我該如何實現呢?

一個人使用承諾

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 };
            }
        }
    });
};

您可以使用async及其瀑布方法。 Async是一個NodeJS模塊,但它也可以在瀏覽器中使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM