问题描述
如果我有 2 个承诺,并且我希望只有在 promise1 被拒绝时才在承诺 2 中返回承诺 1,否则 promise2 继续并返回 Promise.resolve() 解释:
const promise1 =(cond)=>{
const x = true;
if(!cond){
return Promise.reject(new Error('Error'))
}
return Promise.resolve('Done')
}
const promise2 =()=> {
//i want to return promise1 if it rejected
return promise1(false)
.then(res=>res)
.catch(e=>e)
//otherwise return Promise.resolve
return Promise.resolve('ok')
}
解决方法
你太复杂了。
第一个函数返回的 Promise 将遵循其成功路径或错误路径,具体取决于 cond
是真还是假。第二个函数不需要测试,因为 Promise 在这方面会照顾自己。
让我们调用函数 f1
和 f2
(它们是函数而不是承诺)。
f1
可以写成...
const f1 = (cond) => {
return cond ? Promise.resolve('Done') : Promise.reject(new Error('Error'));
}
而 f2
将是 ...
const f2 = () => {
return promise1(false)
.then(res => 'OK'); // whatever the result is,deliver 'OK'.
// No need to catch; error status,and its Error object,will naturally propagate to f2's caller.
}
或者,如果您对结果“完成”没有更改为“确定”感到高兴,那么只需写...
const f2 = () => f1(false); // No need for .then() or .catch()
,
您的结构不健康。看看这个:
const promise1 = cond => {
return new Promise((resolve,reject)=>{
if(!cond){
return reject(new Error('Error occur'));
}
return resolve('Done');
})
}
const promise2 = (cond) => {
if(!cond) {
//i want to return promise1 if it rejected
return promise1(cond)
.then(res=>res)
.catch(e=>{throw e});
}
//otherwise return Promise.resolve
return new Promise(resolve => {
return resolve("ok");
})
}
try {
promise2(true).then(result => {
console.log(result);
});
promise2(false).catch(err => {
throw err;
})
} catch (error) {
console.err(error.message);
}