Может ли Promise.all (). Finally () вернуть неразрешенные данные? - PullRequest
0 голосов
/ 03 марта 2019

Я обнаружил довольно необычное поведение Promise.all (). Finally () - похоже, он возвращает данные до того, как map () был применен к этому.1. Данные, полученные из базы данных.2. Выполнение вызова API Карт Google внутри map (), примененного к данным, полученным из базы данных, и добавление к свойству объекта «Расстояние» с результатом вызова API Google.3. Вернуть данные в Promise.all () - данные, полученные без нового свойства.Я не могу понять, как это вообще возможно?

public static get = async (req: Request, res: Response) => {
    const latitude = req.query.lat;
    const longitude = req.query.long;
    const pool = await new sql.ConnectionPool(CommonConstants.connectionString).connect();
    const request = pool.request();
    const result = await request.execute('SuppliersSP');
    sql.close();
    const rows = result.recordset.map(async (supplier) => {
        const data = { origin: [latitude, longitude], destination: [supplier.Latitude, supplier.Longitude] };
        const distance = await GetDistance(data) || 0;
        Object.defineProperty(supplier, 'Distance', {
            enumerable: true,
            configurable: true,
            writable: true,
            value: distance
          });
        return supplier;
    })
    Promise.all(rows).finally(() => {
        res.setHeader('Access-Control-Allow-Origin', '*');
        res.status(200).json(rows);
    });
}

Вот функция GetDistance:

import { Constants } from "./constants";
const https = require('https');

    export function GetDistance(coords) {
        const { origin, destination } = coords;
        return new Promise((resolve, reject) => {
            https.get(`${Constants.GoogleMapsUrl}?origins=${origin[0]},${origin[1]}
             &destinations=${destination[0]},${destination[1]}
             &key=${Constants.GoogleMapsApiKey}`, (resp) => {
                let data = '';
                resp.on('data', (chunk) => {
                    data += chunk;
                });
                resp.on('end', () => {
                    const distance = JSON.parse(data);
                    resolve(distance.rows[0].elements[0].distance.value);
                });
            }).on("error", (err) => {
                reject("Error: " + err.message);
            });
        });
    }

1 Ответ

0 голосов
/ 18 апреля 2019

Это было решено путем изменения .finally() на .then().

...