Условно вызвать обещание (или нет), но вернуть либо результат другому обещанию - PullRequest
0 голосов
/ 05 февраля 2019

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

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 также запрещено в моем случае.

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

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019
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 голосов
/ 05 февраля 2019

Я бы просто не использовал синтаксис 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
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...