Разрешить обещание, когда запрос карты будет завершен - PullRequest
0 голосов
/ 28 апреля 2019

Я работаю над страницей закладок, мы получаем результаты закладок с идентификатором ресторана с закладкой.Затем я сопоставляю ответ и выдвигаю его как объекты в массив.

Я хочу разрешить весь законченный массив, чтобы потом можно было манипулировать данными.

Я создал функцию getData, которая выполняетзапрос к закладке API, в onSucces я вызываю функцию с именем mapResult, которая выглядит следующим образом:

mapResults(result: Array<any>, type: string): Promise<any> {
    const promise = new Promise<any>((resolve, reject) => {
        const requests = result.map((res, i) => {
            this.getRestaurantById(res.RestaurantId).then(restaurant => {
                const bookmarks = {
                     createdDate: res.CreatedDate,
                     restaurant: restaurant[0]
                };
                this.savedData[type].push(bookmarks);
            });
        });
        Promise.all(requests).then((completed) => {
            if(completed) {
                console.log(completed)
                resolve(this.savedData[type]);
            }
        })
    });
    return promise;
}

Где я подписываюсь, как это:

this.mapResults(result, type).then(data => {
    console.log(data)
});

Но data console.log - это не весь массив данных, он просто разрешит первый объект.

Почему функция Promis.all не ожидает завершения карты?

Ответы [ 2 ]

3 голосов
/ 28 апреля 2019

У вас есть несколько проблем в вашем коде:

  • Вы не return ничего в result.map обратном вызове
  • new Promise не обязательно
  • Вы не должны использовать переменную состояния вместо значения, возвращаемого обещанием
  • Переменная completed не имеет никакого смысла

Этот код должен работать как положено:

mapResults(result: Array<any>, type: string): Promise<any> {
    // you don't need "new Promise" as "getRestaurantById" already returns a promise itself

    const requests = result.map((res) => {
        // here you forgot to return something
        return this.getRestaurantById(res.RestaurantId).then(restaurant => {
            return {
                createdDate: res.CreatedDate,
                restaurant: restaurant[0]
            };
        });
    });

    // using "completed" did not make any sense as it is just an array filled with "undefined"s
    return Promise.all(requests).then((restaurants) => {
        console.log(restaurants)
        // TODO store "restaurants" in "this.savedData[type]" if needed
        return restaurants;
    });
}
0 голосов
/ 28 апреля 2019

Вы не возвращаете свое обещание на карте.

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