Итак, я думаю, что основная проблема, с которой вы сталкиваетесь, заключается в том, что вы вызываете 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;
}
Это написано «не по назначению», поэтому не могу сказать, что оно будет работать как есть, но должно дать представление.