Обещать все в машинописи не разрешает все - PullRequest
1 голос
/ 01 октября 2019

В моем коде мне нужно обновить модель

{
"customerCode": "CUS15168",
"customerName": "Adam Jenie",
"customerType": "Cash",
"printPackingSlip": "true",
"contacts": [
    {
        "firstName": "Hunt",
        "lastName": "Barlow",
        "email": "huntbarlow@volax.com",
        "deliveryAddress": "805 Division Place, Waumandee, North Carolina, 537",
    },
    {
        "firstName": "Barlow",
        "lastName": "Hunt",
        "email": "huntbarlow@volax.com",
        "deliveryAddress": "805 Division Place, Waumandee, North Carolina, 537",
    }
],
"deliveryAddress": [
    {
        "addressName": "Postal",
        "addressType": "postal address",
        "addressLine1": "plaza street",
        "addressLine2": "broome street",
        "suburb": "Guilford",
        "city": "Oneida",
        "state": "Colorado",
        "postalCode": "3971",
        "country": "Belarus",
        "deliveryInstruction": "test delivery address"
    },
    {
        "addressName": "Physical",
        "addressType": "physical address",
        "addressLine1": "plaza street",
        "addressLine2": "broome street",
        "suburb": "Guilford",
        "city": "Oneida",
        "state": "Colorado",
        "postalCode": "3971",
        "country": "Belarus",
        "deliveryInstruction": "test delivery address"
    }
]
}

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

public async createCustomer(customer: CustomerDTO): Promise<CustomerDTO> {
    let deliveryAddress = [];
    let contacts = [];

    let customerDto = new CustomerDTO();

    customerDto.customerCode = customer.customerCode;
    customerDto.tenantId = customer.tenantId;

    if (customer.contacts.length > 0) {
        customer.contacts.map((element => {
            contacts.push(element);
        }));
        customer.contacts.length = 0;
    }
    if (customer.deliveryAddress.length > 0) {
        customer.deliveryAddress.map((element => {
            deliveryAddress.push(element);
        }));
        customer.deliveryAddress.length = 0;
    }
    const createdCustomer = await this.customerRepo.updateOrCreateCustomer(customer);

    let updatedAddress = deliveryAddress.map(async (address: CustomerDeliveryAddressDto) => {
        return await this.customerRepo.updateDeliveryAddress(address, customerDto, address._id);
    });
    let updatedContacts = contacts.map(async (contact: CustomerContactsDto) => {
        return await this.customerRepo.createOrUpdateContactList(contact, customerDto, contact._id);
    });
    return Promise.all([updatedAddress, updatedContacts]).
        then((results: [Promise<boolean>[], Promise<boolean>[]]) => {
            console.log(results);
            return this.customerRepo.getLastUpdatedCustomer();
        }).
        then((result) => {
            return result;
        }).
        catch(e => {
            console.error(e);
            return e;
        });

}

В customerRepository

public async updateDeliveryAddress(deliveryAddressDto: CustomerDeliveryAddressDto, customerDto: CustomerDTO, deliveryAddressId: string): Promise<boolean> {
    const customerToBeUpdated = await this.model.findOne({
        customerCode: customerDto.customerCode,
        tenantId: customerDto.tenantId
    });
    if (customerToBeUpdated !== null) {
        if (deliveryAddressId != null || deliveryAddressId != undefined) {

            const result = await this.model.findOneAndUpdate({ _id: customerToBeUpdated._id, deliveryAddress: { $elemMatch: { _id: deliveryAddressId } } },
                {
                    $set: {
                        //code here
                    }
                },
                { 'new': true, 'safe': true, 'upsert': true });
            if (result){
                return true;
            }

        } else {
            const result = await this.model.findOneAndUpdate({ _id: customerToBeUpdated._id },
                {
                    $push: { deliveryAddress: deliveryAddressDto }
                },
                { 'new': true, 'safe': true, 'upsert': true }
            );
            if (result) {
                return true;
            }
        }
    } else {
        return false;
    }
}

Проблема заключается в том, что он не разрешает все методы, когда он собирается обещать все методы, и мне нужно получитьпоследний обновленный клиент, но он дает результат DeliveryAddress и контакты с пустыми массивами. Документ клиента на mongodb обновляется по мере необходимости.

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Вы также можете вкладывать Promise.all

let updatedAddress = Promise.all(deliveryAddress.map(async (address: CustomerDeliveryAddressDto) => {
  return await this.customerRepo.updateDeliveryAddress(address, customerDto, address._id);
}));

let updatedContacts = Promise.all(contacts.map(async (contact: CustomerContactsDto) => {
  return await this.customerRepo.createOrUpdateContactList(contact, customerDto, contact._id);
}));


return Promise.all([updatedAddress, updatedContacts])
0 голосов
/ 01 октября 2019

Вам необходимо передать обещания непосредственно в виде плоского массива.

Promise.all для MDN

Если итерация содержит значения без обещаний,они будут игнорироваться, но все равно будут учитываться в возвращенном значении массива обещаний (если обещание выполнено)

Это можно легко сделать с помощью оператора распространения .

let updatedAddress = deliveryAddress.map(async (address: CustomerDeliveryAddressDto) => {
  return await this.customerRepo.updateDeliveryAddress(address, customerDto, address._id);
});
let updatedContacts = contacts.map(async (contact: CustomerContactsDto) => {
  return await this.customerRepo.createOrUpdateContactList(contact, customerDto, contact._id);
});

// need to give a flat array to Promise.all, so use the `...` spread operator.
return Promise.all([...updatedAddress, ...updatedContacts]).then(/* ... */

Кроме того, поскольку вы уже используете async / await, нет причины, по которой вы не можете await Promise.all позвонить.

const results = await Promise.all([...updatedAddress, ...updatedContacts]);
console.log(results);
return this.customerRepo.getLastUpdatedCustomer();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...