возникли проблемы при попытке написать следующий код таким образом, чтобы не включать вложенные обещания.
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, но это меня озадачило.
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));
}
Я бы просто не использовал 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
});
}
return Promise.resolve(data);
внутри обработчика .then()
. Вы можете просто return data;
,