Условно вызвать обещание (или нет), но вернуть либо результат другому обещанию

1

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

function trickyFunction(queryOptions, data) {
  return new Promise((resolve, reject) => {
    if (data) {
      resolve(data);
    } else {
      // ... a bunch of conditions to check and/or modify queryOptions. These checks and mods
      // are vital but only required if data is not passed in. ...
      if (anErrorHappensHere) {
        reject('Oh no, an error happened');
      }

      somePromise(queryOptions).then((result) => {
        resolve(result);
      });
    }
  }).then((result) => {
    criticalOperation1(result);
    // the code here is long and shouldn't be duplicated
  });
}

Мне действительно не нравится цепочка .then() после somePromise поскольку она находится внутри new Promise, но я действительно не вижу пути обхода. Если я возьму условное из обещания, мне придется продублировать код критической операции1, который здесь не вариант. Условные проверки в блоке else должны выполняться только в том случае, если data не передаются. Выполнение других функций в моем случае не разрешено, а использование async/await также запрещено в моем случае.

У кого-нибудь есть какие-либо идеи? Я немного поработал с Promises, но это меня озадачило.

  • 0
    Вы должны изучить новый синтаксис для обещания async / await.
  • 0
    @AshokPatidar Пожалуйста, прочитайте мой вопрос, я упоминаю, что это не разрешено в моем случае
Теги:
asynchronous
promise

2 ответа

0
function trickyFunction(queryOptions, data) {
    return new Promise((resolve, reject) => {
    if (anErrorHappensHere) {
        reject('Oh no, an error happened');
    }
    resolve({data, queryOptions});
    }).then((obj) => {
        if(obj.data){
        return Promise.resolve(obj.data);
        } else {
        return somePromise(obj.queryOptions)
       }
    }).then((result) => criticalOperation1(result));
    .catch((err)=> console.log(err));
}
0

Я бы просто не использовал new Promise синтаксис new Promise в этом случае и просто начал цепочку обещаний рано

function trickyFunction(queryOptions, data) {
  return Promise.resolve()
    .then( () => {
      if (data) {
        return Promise.resolve(data);
      } else {
        // ... a bunch of conditions to check and/or modify queryOptions. These checks and mods
        // are vital but only required if data is not passed in. ...
        if (anErrorHappensHere) {
          // Could also just throw here
          return Promise.reject('Oh no, an error happened');
        }

        return somePromise(queryOptions);
      }
    })
   .then((result) => {
      criticalOperation1(result);
      // the code here is long and shouldn't be duplicated
    });
}
  • 0
    К вашему сведению, нет причин return Promise.resolve(data); внутри обработчика .then() . Вы можете просто return data; ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню