承诺 - 在两个承诺之间调用函数

时间:2017-01-27 13:27:38

标签: javascript promise es6-promise

我有两个请求和一些函数要在它们之间调用。流程是当第一个promise被调用并完成时,无论结果是什么(成功或失败),都应该调用一些非promise相关函数,并且只有在我们应该调用第二个promise之后。所以这就是我最终做到的方式,这看起来不是一个好的解决方案。

funtionReturnsPromise()
    .then(()=>{})
    .catch(()=>{})
    .then(()=>{
        nonPromiseRelatedFuntion()
    })
    .then(()=>{
        return funtionReturnsPromise2()
    })

3 个答案:

答案 0 :(得分:0)

由于所需的流程为:

Promise > Function > Promise

无论第一个承诺的结果如何,执行该函数,您只需执行以下操作:

function secondFunction(outcome) {
  // do stuff
  
  return funtionReturnsPromise2()
}

functionReturnsPromise().then(secondFunction).catch(secondFunction)

现在,关于另一个话题,我不会将第二个函数称为“无关”,因为根据你的解释,它很明显需要在第一个承诺完成后调用。

答案 1 :(得分:0)

假设nonPromiseRelatedFuntion是同步的,并且您对functionReturnsPromise

的返回值不感兴趣
functionReturnsPromise()
.then(
  // no matter what happens, the function is invoked
  () => { nonPromiseRelatedFunction() },
  error => { 
    nonPromiseRelatedFunction()
    // do error handling from functionReturnsPromise
  } 
)
.then(() => functionReturnsPromise2() }
.catch(console.error)

如果您需要值:

functionReturnsPromise()
.then(
  value => {
    nonPromiseRelatedFunction()
    return functionReturnsPromise2(value)
  },
  error => { 
    nonPromiseRelatedFunction()
    // do error handling from functionReturnsPromise
  } 
)
.catch(console.error) // error handling from functionReturnsPromise2

答案 2 :(得分:0)

像其他答案一样,我假设

  • nonPromiseRelatedFunction是同步的
  • 你真的不关心任何返回值
  • nonPromiseRelatedFunction funtionReturnsPromise2应该在所有情况下执行
  

读完 ALL 对问题的评论后,我看到上述情况毕竟不是假设

最简单的解决方案是摆脱第一个.then

funtionReturnsPromise()
    .catch(()=>{})
    .then(()=>{
        nonPromiseRelatedFuntion()
    })
    .then(()=>{
        return funtionReturnsPromise2()
    })

注意:可以编写此类代码

funtionReturnsPromise()
    .catch(()=>{})
    .then(nonPromiseRelatedFuntion)
    .then(funtionReturnsPromise2)

当然,最后两个函数将接收参数,但如果这些函数中的代码无论如何都忽略了参数,那么它们就没有问题了