【问题标题】:chaining multiple promises链接多个承诺
【发布时间】:2017-10-01 18:20:03
【问题描述】:

我试图了解 Promise 是如何工作的,但我不明白为什么我需要多次按下我的按钮,这个 Promise 链才能工作。

  1. 第一个函数创建新用户并返回一个承诺。
  2. 如果用户有车,第二次更新其他系统。
  3. 第三个应该在收到汽车 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);
   })

【问题讨论】:

  • 你没有从传递给.then()的函数中返回promise,所以it返回的promise不会等待任何东西。
  • 虽然嵌套 Promise 是这段代码中的一个问题,但真正的问题可能在于处理您的按钮点击的代码,这里不存在。
  • 我决定将函数从 promise 重构为 async/await。更容易理解流程是如何进行的。我的承诺链的另一件事与此线程中所说的相同link

标签: javascript es6-promise


【解决方案1】:

你想要完成的事情很难用承诺来完成。我将冒险不直接回答您的问题,而是间接回答并帮助您解决您可能遇到的与工作流程相关的所有类似问题。向async library打个招呼。

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

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。还有很多其他功能。

正如我所说,这是一个可以解决您的问题的答案,但并不完全按照您的要求。如果您对这个链式回调的内部工作原理感到好奇,请忽略我的回答。

干杯,祝你好运!

【讨论】:

    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 2015-04-15
    • 2023-01-27
    相关资源
    最近更新 更多