【问题标题】:How to nest promises?如何嵌套承诺?
【发布时间】:2020-06-09 19:16:43
【问题描述】:

我有一些承诺,例如:

promise1 = function() { return new Promise(a,b){} ....}

promise2 = function() { return new Promise(a,b){} ....}

promise3 = function() { return new Promise(a,b){} ....}

promise4 = function() { return new Promise(a,b){} ....}

可以通过嵌套这些 promise (1,2,3,4) 来创建其他的 Promises,例如:

promiseX = function() {

     return new Promise(function() {

         promise1().then(promise2)...          

     })

 }

 promiseY = function() {

     return new Promise(function() {

         promise3().then(promise4).....        

     })

 }

然后使用最后创建的两个:

promiseX().then(promiseY).then(function().....)

这样做是否正确?无论如何,正确的做法是什么?

【问题讨论】:

标签: javascript promise


【解决方案1】:

首先,为了迂腐,promise1promise4 实际上并不是承诺;它们是返回 Promise 的函数。是的,可以创建一个新函数来对其他两个函数的 Promise 进行排序:

const promiseX = () => promise1().then(promise2)
const promiseY = () => promise3().then(promise4)

promiseX().then(promiseY).then(() => { /* ... */ })

【讨论】:

    【解决方案2】:

    如果您希望承诺按顺序解决,只需说(使用您的示例函数):

    promise1()
    .then( promise2() )
    .then( promise3() )
    .then( promise4() )
    ;
    

    在这个例子中,不要让每个promiseX() 函数都接收到前一个promise 的解析值,而是像你写的那样:

    promise1()
    .then( res => promise2( res ) )
    .then( res => promise3( res ) )
    .then( res => promise4( res ) )
    ;
    

    在这两种情况下,整个 Promise 链的已解决值将是 last 承诺 (promise4) 的已解决值。

    如果您希望它们全部解决,但不关心顺序,那么可以这样:

    Promise.all([
      promise1(),
      promise2(),
      promise3(),
      promise4()
    ]);
    

    你会的。但是请注意,如果任何一个 Promise 拒绝,上述两个示例都将拒绝。解析的值将是所有承诺的解析值的数组:[ v1, v2 v3, v4 ]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      • 2019-05-22
      相关资源
      最近更新 更多