簡體   English   中英

如何使用Promise.all()函數

[英]How to use the Promise.all() function

我正在創建一個大學項目,以顯示在利茲發生的事件。 我幾乎已經完成了使用EventbriteAPI所做的此頁面。 但是,目前我的頁面只有在弄清楚所有事件的場地名稱后才需要花費幾秒鍾的時間才能加載。

我相信我需要使用Promise.all()函數來實現此目的,但是由於我對此還很陌生,因此我難以理解如何實現它。

eventbrite.js

class EventBrite {
    constructor() {
        this.auth_token = 'Example';
        this.orderby = 'date';
        this.city = 'Leeds';
    }

    //Load Leeds events from API
    async loadAPI() {
        const initalEvents = await fetch(`https://www.eventbriteapi.com/v3/events/search/?sort_by=${this.orderby}&location.address=${this.city}&token=${this.auth_token}`);

        const events = await initalEvents.json();

        return {
            events
        }
    }

    async loadVenue(venueID) {
        const initalVenue = await fetch(`https://www.eventbriteapi.com/v3/venues/${venueID}/?token=${this.auth_token}`);

        const venue = await initalVenue.json();

        return venue;
    }
}

app.js

eventbrite.loadAPI()
    .then(async events => {
        //Check for events
        const eventsList = events.events.events;

        //Print venue IDs
        for(let i = 0, l = eventsList.length; i < l; i++) {
            const venueID = eventsList[i].venue_id;

            let venue = await eventbrite.loadVenue(venueID);
            eventsList[i].venue = venue.name
        }
        ui.displayEvents(eventsList);
    }
)

ui.js

class UI {
    constructor() {
        this.init();
    }
    init() {
        this.printCategories();

        this.result = document.getElementById('result');
    }

    //Display events
    displayEvents(events) {   
        //Build template
        let HTMLTemplate = '';
        events.forEach(eventInfo => {
            HTMLTemplate += `
                <div class="row">
                    <div class="column">
                        <p class="event">${eventInfo.name.text}</p>
                        <p class="event">${eventInfo.venue}</p>
                        <p class="event">${eventInfo.start.local}</p>
                    </div>
                </div>
            `;
        });
        this.result.innerHTML = HTMLTemplate;
    }
}

一個問題是,您要依次進行所有這些調用,這意味着完成這些調用的時間加起來了。

最好在paralell中運行它們:

eventbrite.loadAPI()
    .then(async events => {
        let promises = events.events.events.map(async (eventInfo) => {
            let venue = await eventbrite.loadVenue(eventInfo.venue_id);
            eventInfo.venue = venue.name;
            return eventInfo;
        });

        const eventsList = await Promise.all(promises);

        ui.displayEvents(eventsList);
    });

如果響應緩慢返回並且第一個和最后一個之間有很大差異,則可以呈現中間結果:

eventbrite.loadAPI()
    .then(events => {
        const eventsList = events.events.events;

        eventsList.forEach(async (eventInfo) => {
            let venue = await eventbrite.loadVenue(eventInfo.venue_id);
            eventInfo.venue = venue.name;

            ui.displayEvents(eventsList.filter(item => item.venue));
        });
    });

暫無
暫無

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

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