2017-05-03 107 views
0

我试图了解承诺如何工作,但我不明白为什么我需要按下我的按钮超过这个承诺链工作几次。链接多个承诺

  1. 第一个函数创建新用户并返回一个承诺。
  2. 如果用户有车,则更新其他系统。
  3. 第三个应该在收到车号时更新用户对象。

当我只按下按钮CreateUser被解雇。如果我再次按下按钮,它也会触发UpdateModel

CreateUser(newUser).then((userObject) => { 
     if(userObject.car) { 
      UpdateModel(userObject.objectId, userObject.car).then((carId) => { 
       userObject.car = carId; 
       UpdateUser(userObject).then((updatedUser) => { 
        this.moveNextPage(updatedUser); 
       }); 
      }, (error) => { 
       console.log(error); 
      }); 
     } else { 
      this.moveNextPage(userObject); 
     }  
    }, (error) => { 
     console.log(error); 
    }) 
+0

你不会返回传递给'.then()'的函数的promise,所以promise * it *返回的promise不会等待任何东西。 – Ryan

+0

虽然嵌套承诺是此代码中的一个问题,但真正的问题可能在于处理按钮点击的代码,而这不在此处。 – Joseph

+0

[我如何访问以前的承诺导致.then()链可能重复?](http://stackoverflow.com/questions/28250680/how-do-i-access-previous-promise-results-in- a-then-chain) –

回答

0

你试图完成的事情很难承诺。我将承担不直接回答您的问题的风险,但会间接回答并帮助您解决与工作流相关的所有类似问题。打个招呼吧async library

这个库旨在解决所谓的“回调地狱”,你现在正面临着这个问题。例如,从同步编程背景来看,认为我们可以将函数的输出用作下一个函数的输入是很自然的。异步,瀑布完全符合我们的要求,隐藏回调地狱结构(感谢上帝)。因此,对于你的问题的解决方案会简单地把你的功能,在这种结构中(从异步复制的文件):

async.waterfall([ 
    function(callback) { 
     callback(null, 'one', 'two'); 
    }, 
    function(arg1, arg2, callback) { 
     // arg1 now equals 'one' and arg2 now equals 'two' 
     callback(null, 'three'); 
    }, 
    function(arg1, callback) { 
     // arg1 now equals 'three' 
     callback(null, 'done'); 
    } 
], function (err, result) { 
    // result now equals 'done' 
}); 

所以,这让你感觉几乎一样回到同步的语言!如果您需要并行或串行执行函数(不使用前一个函数的函数),则可以使用async.parallel或async.each。还有很多其他功能。

正如我所说,这是一个解决您的问题的答案,但不完全符合您的要求。如果你对这些链式回调的内部运作情况感到好奇,请忽略我的回答。

干杯和祝你好运!