Исправить вложенную цепочку обещаний - PullRequest
0 голосов
/ 14 февраля 2020

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

Причина рефактора в том, что мне нужно добавить дополнительный функциональный вызов в этот поток, прямо посередине ?

СУЩЕСТВУЮЩИЙ:

initFirestore()
  .then(() => {
    console.log('Firestore has been initialized.');
    seedServices()
      .then(customerId => {
// here is where my new function would need to live.
        seedFirestore()
          .then(() => {
            console.log('Seed created for Customer: ', customerId);
          })
          .catch(err => {
            console.log('Trouble seeding firestore with seedTemplates', err);
          });
      })
      .catch(customerId => {
        console.log('Seed created with warnings for  Customer: ', customerId);
      });
  })
  .catch(err => {
    throw new Error(err);
  });

Мое предлагаемое обновление:

initFirestore()
  .then(() => {
    console.log('Firestore has been initialized.');
  })
  .catch(err => {
    throw new Error(err);
  })
  .then(() => seedServices())
  .then(customerId => customerId)
  .catch(err => {
    console.log('Trouble seeding firestore with seedTemplates', err);
  })
  .then(async customerId => {
    await myNewFunction().then(
      (response) => {
        console.log(response);
      }
    );
    return customerId;
  })
  .then(async customerId => {
    await seedFirestore();
    return customerId;
  })
  .then(customerId => {
    console.log('Seed created for Customer: ', customerId);
  })
  .catch(customerId => {
    console.log('Seed created with warnings for  Customer: ', customerId);
  });

Я не доволен смешиванием catch в цепочке ... Как еще я могу это сделать?

1 Ответ

1 голос
/ 14 февраля 2020

На самом деле то, что вы делаете - это нормально, если вы хотите отлавливать ошибки, регистрируйте предупреждение и затем продолжаете в любом случае.

Это асинхронный / ожидающий эквивалент:

let customerId;
try {

    try {
      await initFirestore()
      console.log('Firestore has been initialized.');
    } catch(err) {
      throw new Error(err);
    });

    try {
      customerId = await seedServices());
    } catch(err) {
      console.log('Trouble seeding firestore with seedTemplates', err);
    };

    const response = await myNewFunction();
    console.log(response);

    await seedFirestore();
    console.log('Seed created for Customer: ', customerId);

} catch (err) {
   console.log('Seed created with warnings for  Customer: ', customerId);
}

Что странно здесь:

  1. Немедленно повторно выдает полученную ошибку, завернутую в new Error().
  2. Использование исключений для предупреждений

И, возможно, вы можете немного очистить свой код, подняв тогда переменную customerId за пределы первой, так что вам не придется ее везде передавать.

Редактировать есть проблемы с вашим кодом, не каждый путь правильно перенаправляет customerId в следующий обработчик then (). Если вы хотите использовать then () / catch () вместо async / await.

У меня возникнет один вопрос: действительно ли вы хотите продолжить работу даже после сбоя seedServices. Я предполагаю «нет», поэтому я переписал бы ваш код в:

let customerId;

initFirestore()
  .then(() => {
    console.log('Firestore has been initialized.');
    return seedServices();
  })
  .then(cId => {
    customerId = cId;
    return myNewFunction();
  })
  .then(() => seedFireStore());
  .then(() => {
    console.log('Seed created for Customer: ', customerId);
  })
  .catch(customerId => {
    console.log('Error while creating seed for customer ', customerId);
  });

асинхронный / ожидающий эквивалент:

let customerId;

try {
  await initFirestore()
  const customerId = await seedServices();
  await myNewFunction();
  await seedFireStore());

  console.log('Seed created for Customer: ', customerId);

} catch(err) {
  console.log('Error while creating seed for customer ', customerId);
});

Если вы сделали хочу отлавливать ошибки и продолжать в любом случае (после seedServices), я бы порекомендовал разделить ваши операции на несколько разных функций. Это всегда лучше, чем вложение ваших цепочек обещаний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...