Обещанные данные не доступны - PullRequest
0 голосов
/ 28 марта 2019

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

Но результат обещания (ресторан с расстоянием) не содержит расстояние.

Вот мой кодЯ пытался, журналы консоли возвращали мне массив WITH distance, но когда я установил точку останова в отладчике Chrome, я не смог увидеть это свойство.

Это обещание calculateDistance function:

 calculateDistance(restaurants: Array<Restaurant>): Promise<Array<Restaurant>> {
    const promise = new Promise<any>((resolve, reject) => {
        // const restaurantDistances = [];

        restaurants.map((restaurant) => {
            const restaurantLocation: LatLng = new LatLng({
                lat: restaurant['Restaurant']['Lat'],
                lng: restaurant['Restaurant']['Long']
            });

            this.locationService.getUserLocation().then(() => {
                this.googlemapService.initGoogleMapsApi().then(() => {
                    const distance = this.googlemapService.computeDistanceBetween(this.locationService.location, restaurantLocation);
                    restaurant['Restaurant']['Distance'] = distance;
                    // restaurantDistances.push(restaurant);
                    console.log(restaurants, 'restMap', restaurant, distance);
                    resolve(restaurants);
                });
            }).catch( error => {
                console.log('error = ', error);
            });
        });
    });
    return promise;
}

это внутри функции успеха:

this.calculateDistance(restaurants).then((restaurantsDist) => {
  console.log('after Calc distance', restaurantsDist, restaurants);
  this.determinInstanceStorage(fetchMethodName, restaurantsDist, resolve);
});

Может кто-нибудь мне помочь, я разрешу результат методом map, может быть, это вызывает проблему?

1 Ответ

1 голос
/ 28 марта 2019

Итак, я думаю, что основная проблема, с которой вы сталкиваетесь, заключается в том, что вы вызываете resolve(restaurants) внутри цикла restaurants.map.Это означает, что на первой итерации цикла вы будете выполнять обещание.Теперь, если ваш цикл достаточно мал и время обработки для каждой из итераций достаточно мало, вы, возможно, не заметите этого, поскольку цикл будет продолжаться, и все будет заполнено, но любое исследование «момента времени» (например,контрольные точки) покажет то, что вы видите - что не все рестораны были обработаны.

Есть пара других вещей, которые, я думаю, также могут помочь.Не будучи знакомым с используемыми там API-интерфейсами или средой, в которой вы работаете, я не могу быть уверен на 100%.И с this.locationService.getUserLocation, и с this.googleMmapService.initGoogleMapsApi они выглядят как операции, которые должны выполняться только один раз (не для каждого экземпляра цикла restaurants).Можете ли вы вытащить их из цикла restaurants.map?

Кроме того, изменение этой функции на async может облегчить чтение, поскольку у вас есть этот многокаскадный код then с.Итак, в конце концов, что-то вроде этого:

async function calculateDistance(restaurants: Array<Restaurant>): Promise<Array<Restaurant>> {
    await this.locationService.getUserLocation();
    await this.googlemapService.initGoogleMapsApi();
    restaurants.map((restaurant) => {
        const restaurantLocation: LatLng = new LatLng({
            lat: restaurant['Restaurant']['Lat'],
            lng: restaurant['Restaurant']['Long']
        });

        const distance = this.googlemapService.computeDistanceBetween(
            this.locationService.location, restaurantLocation
        );
        restaurant['Restaurant']['Distance'] = distance;
        // restaurantDistances.push(restaurant);
        console.log(restaurants, 'restMap', restaurant, distance);
    });
    return restaurants;
}

Это написано «не по назначению», поэтому не могу сказать, что оно будет работать как есть, но должно дать представление.

...