【问题标题】:However to return promise only if rejected?但是只有在被拒绝时才返回承诺?
【发布时间】:2021-06-12 14:19:34
【问题描述】:

如果我有 2 个 Promise,并且我希望仅在 Promise1 被拒绝时在 Promise 2 中返回 Promise 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') 


}

【问题讨论】:

  • return promise1(false).then(() => "ok").catch((err) => Promise.reject(err))?或者您可以使用async/await 语法编写它,这可能会使意图更清晰。

标签: javascript promise


【解决方案1】:

您的结构不健康。看看这个:

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);
}

【讨论】:

  • 谢谢,但我不依赖条件,我想依赖于承诺是否会被拒绝然后返回
【解决方案2】:

你太复杂了。

第一个函数返回的 Promise 将遵循其成功路径或错误路径,具体取决于 cond 是真还是假。第二个函数不需要测试,因为 Promises 在这方面会照顾自己。

让我们调用函数f1f2(它们是函数而不是承诺)。

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-09
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2019-03-27
    相关资源
    最近更新 更多