Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 连锁多重承诺_Javascript_Es6 Promise - Fatal编程技术网

Javascript 连锁多重承诺

Javascript 连锁多重承诺,javascript,es6-promise,Javascript,Es6 Promise,我试图理解承诺是如何起作用的,但我不明白为什么我需要在这个承诺链上多次按下按钮才能起作用 第一个函数创建新用户并返回承诺 第二个更新其他系统,如果用户有车 第三,当收到汽车id时,应该更新用户对象 当我按下按钮时,仅会触发CreateUser。如果我再次按下按钮,它也会触发UpdateModel CreateUser(newUser).then((userObject) => { if(userObject.car) { UpdateModel(user

我试图理解承诺是如何起作用的,但我不明白为什么我需要在这个承诺链上多次按下按钮才能起作用

  • 第一个函数创建新用户并返回承诺
  • 第二个更新其他系统,如果用户有车
  • 第三,当收到汽车id时,应该更新用户对象 当我按下按钮时,仅会触发
    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);
       })
    

    你想要实现的目标很难有承诺。我将冒风险不直接回答您的问题,而是间接回答,并帮助您解决与工作流相关的所有类似问题。向朋友问好

    这个库旨在解决您现在面临的所谓的“回调地狱”。从同步编程的背景来看,我们自然会认为我们可以使用一个函数的输出作为下一个函数的输入,例如。异步,瀑布为我们做到了这一点,隐藏了回调地狱结构(感谢上帝)。因此,问题的解决方案就是将函数放在这个结构中(复制自异步文档):

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

    正如我所说,这是一个解决你问题的答案,但不是你问的那样。如果您对这个链式回调的内部工作方式感到好奇,请忽略我的答案


    干杯,祝你好运

    您没有从传递给
    .then()
    的函数返回承诺,因此它返回的承诺不会等待任何结果。虽然嵌套承诺是此代码中的一个问题,但真正的问题可能在于处理按钮单击的代码,我决定将函数从promission重新构造为async/await。更容易理解流程是如何进行的。我的承诺链的另一件事和这篇帖子里说的一样
    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'
    });