Создать обещание> из нескольких обещаний <U> - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь получить счета для нескольких клиентов, используя машинопись:

У меня есть класс Server, который обрабатывает запросы к серверу и предоставляет класс getBills, который возвращает Promise<Bill[]>:

class Server {
    constructor(hostname?: string) {
        hostname = hostname || "";

    }

    getBills(customer: Customer): Promise<Datapoint[]> {
        const apiEndPoint = new URL("/API/Bills");
        let parameters = { customer: customer.name};

        //Fetch official doc
        //https://github.com/whatwg/fetch/issues/56
        Object.keys(parameters).forEach(key => apiEndPoint.searchParams.append(key, parameters[key]));

        return fetch(apiEndPoint.toString())
            .then(response => {
                if (!response.ok) {
                    throw new Error(response.statusText)
                } 
                return response.json()
            })
    }    
}

Я хотел бы запросить счета для нескольких клиентов и вернуть карту для дальнейшей обработки (и сохранить все это асинхронно, Promise<Map<Customer, Bill[]>>, но я борюсь с этим шагом.

Что у меня есть:

getBills(): Promise<Map<Customer, Bill[]>> {
        let server = this.context.server;
        let resultMap = new Map<Customer, Bill[]>();

        let promises = [];

        for (let customer of this.customers) {
            promises.push(
                server.getBills(customer).then(result => resultMap.set(customer, result))
            );
        }
        Promise.all(promises).then(return resultMap);
    }

Но он не компилируется, так как пытается вернуть саму карту, а не Обещание.

Iпытался использовать

 Promise.all(promises).then(return Promise.resolve(resultMap));

, но он тоже не работает.

Не могли бы вы указать мне правильное направление?

Ответы [ 2 ]

0 голосов
/ 02 января 2019

@ trincot уже объяснил синтаксическую ошибку, но вместо того, чтобы просто написать return Promise.all(promises).then(() => { return resultMap; });, я бы предложил не создавать Map, пока у вас не будут все результаты:

getBills(): Promise<Map<Customer, Bill[]>> {
    const server = this.context.server;
    const promises = this.customers.map(customer => 
        server.getBills(customer).then(bills => [customer, bills])
    );
    return Promise.all(promises).then(tuples => new Map(tuples));
}
0 голосов
/ 02 января 2019

Синтаксическая ошибка для записи:

.then(return resultMap);

Метод then должен получить функцию в качестве аргумента, в то время как return является просто оператором, а не функцией,Так что измените на:

.then(() => resultMap);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...