Правильный способ получения обещаний для массивов (пример мангуста) - PullRequest
0 голосов
/ 28 июня 2018

Мне нужно понять правильный способ каскадных обещаний с помощью мангусты.

Моя функция createCustomerBills с получением списка идентификаторов клиентов, для которых мне нужно создать простой счет.

Вот код:

const createCustomerBill = (customer) => {
    return BillModel.create({
        customer_id: customer.id,
        value: 100
    });
}

const createCustomerBills => (customerIds) => {
    let criteria = {
        _id: { $in: customerIds }
    };

    return CustomerModel.find(criteria)
    .then(result => {
        return result.map(customer => {
            return createCustomerBill(customer);
        }
    })
    .then(result => {
        return CustomerModel.update(
                { _id: customer.id }, 
                { status: "BillCreated" }
        );
    });
}

Вот шаги: 1. Получить список всех клиентов 2. Для каждого клиента создайте счет 3. Для каждого созданного счета обновите статус клиента

Мне нужен совет, если это правильный способ сделать это и возможные недостатки.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Поскольку вы отображаете результат CustomerModel.find, возвращение этого массива не будет ждать выполнения обещаний для запуска следующего .then, поскольку массив не является Promise

Вот где Promise.all приходит

Кроме того, так как вам необходимо обновлять каждый счет отдельно, эта часть цепочки обещаний должна быть внутри .map итерации

const createCustomerBill = customer => 
    BillModel.create({
        customer_id: customer.id,
        value: 100
    });

const createCustomerBills => customerIds => {
    let criteria = {
        _id: { $in: customerIds }
    };

    return CustomerModel.find(criteria)
    .then(result => 
        Promise.all(
            result.map(customer => createCustomerBill(customer)
                .then(result => CustomerModel.update({ _id: customer.id }, { status: "BillCreated" }))
            )
        )
    )
    .then(result => {
        // all bills are now processed 
    });
}
0 голосов
/ 28 июня 2018

Вот возможный способ работы, ИМО

const createCustomerBill = (customer) => {
  return BillModel.create({
    customer_id: customer.id,
    value: 100,
  });
}

const createCustomerBills => (customerIds) => {
  const criteria = {
    _id: {
      $in: customerIds,
    },
  };

  return CustomerModel.find(criteria)
    .then((customers) => Promise.all(customers.map(x => createCustomerBill(x)
      .then(() => CustomerModel.update({
        _id: x.id,
      }, {
        status: "BillCreated"
      })))))
    .then(() => console.log('over'))
    .catch(e => console.log(e));
}

А вот и с использованием потрясающего async/await

const createCustomerBill = customer => BillModel.create({
  customer_id: customer.id,
  value: 100,
});

const updateCustomer = customer => CustomerModel.update({
  _id: x.id,
}, {
  status: 'BillCreated',
});

const createBillAndUpdateCustomer = async(customer) => {
  await createCustomerBill(customer);
  
  await updateCustomer(customer);
};

const createCustomerBills => async(customerIds) => {
  const customers = await CustomerModel.find({
    _id: {
      $in: customerIds,
    },
  });

  await Promise.all(customers.map(x => createBillAndUpdateCustomer(x)));

  console.log('over');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...