Экспресс API выхода JS до разрешения обещания - PullRequest
0 голосов
/ 25 февраля 2019

в отображении у меня есть два объекта, которые пойдут на default в switch и 1 запись, которая пойдет на ORDER_OPEN случай, и объект не войдет в операторы if, и он просто переместится на orderArray но при выполнении API я получаю только два объекта из default, а когда я регистрирую orderArray, он проталкивается в objectArray после выполнения API.

router.get('/orderByPhone/:id', async (req, res) => {
const { ORDER_OPEN, ORDER_FILL, BITY_FILL, BITY_CANCEL, getOrderStatusValue } = require('../../lib/constants/orderStatus');
const statusUtils = require('../../lib/constants/orderStatus');
const apiUtils = require('../../lib/apiUtils');
const neo4jUtils = require('../../lib/neo4jUtils');
const orderArray = [];

try {
    const id = req.params.id;

    const response = await neo4jUtils.getOrders(1, id);

    response.records.map(async (record) => {
        switch (record._fields[0].properties.orderStatus) {

            case ORDER_OPEN:
                const ret = await apiUtils.fetchOrderStatus(record._fields[0].properties.bityId, record._fields[0].properties.token);

                if (ret.legacy_status == BITY_FILL) {
                    await neo4jUtils.updateOrderStatus(record._fields[0].properties.bityId, getOrderStatusValue(ret.legacy_status))
                } else if (ret.legacy_status == BITY_CANCEL) {
                    await neo4jUtils.updateOrderStatus(record._fields[0].properties.bityId, getOrderStatusValue(ret.legacy_status))
                }
                orderArray.push({
                    input: {
                        amount: ret.input.amount,
                        currency: ret.input.currency
                    },
                    ouput: {
                        amount: ret.output.amount,
                        currency: ret.output.currency
                    },
                    status: {
                        status: statusUtils.getOrderStatusValue(ret.legacy_status)
                    }
                });

                break;
            case ORDER_FILL:
                orderArray.push({
                    input: {
                        amount: record._fields[0].properties.fromAmount,
                        currency: record._fields[0].properties.fromCurrency
                    },
                    ouput: {
                        amount: record._fields[0].properties.toAmount,
                        currency: record._fields[0].properties.toCurrency
                    },
                    status: {
                        status: record._fields[0].properties.orderStatus
                    }
                });
                break;
            default:
                orderArray.push({
                    input: {
                        amount: record._fields[0].properties.fromAmount,
                        currency: record._fields[0].properties.fromCurrency
                    },
                    ouput: {
                        amount: record._fields[0].properties.toAmount,
                        currency: record._fields[0].properties.toCurrency
                    },
                    status: {
                        status: record._fields[0].properties.orderStatus
                    }
                });
                break;
        }
    });

} catch (error) {
    res.status(500).send(errorHandleing.FiveZeroZero)
}
res.status(200).json(orderArray);
 });

1 Ответ

0 голосов
/ 25 февраля 2019

response.records.map(async (record) => {...} - это функция синхронизации, она вернет массив обещаний, ваш код не будет wait, пока все действия в {...} не будут завершены.Это основная причина, по которой на ваш запрос уходит очень мало времени.

Правильный путь, просто дождитесь завершения всех заданий:

let promises = response.records.map(async (record) => {...}
await Promise.all(promises); // waiting....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...