【问题标题】:What is the difference between these two syntax这两种语法有什么区别
【发布时间】:2015-03-23 12:29:04
【问题描述】:

如果我有

promise = userService.updateUser($stateParams.userId, req);

promise.then(
    function(user) {
        logger.logSuccess('Updated user');
        $scope.resetForm();
        WizardHandler.wizard().goTo(0);
        return user;
    }, 
    function(error) {
        logger.logError('Ups an error has occurred');
        console.error('error updating user: ' + error);
    }
); 

promise.then(function(user) {
    _.each(uploader.getNotUploadedItems(), function(item) {
        return item.formData.push({
            id: user.id
        });
    });
});

然后如果 updateUser 失败,将显示日志,然后第二个 then 将不会执行但是如果我有

promise = userService.updateUser($stateParams.userId, req).then(
    function(user) {
        logger.logSuccess('Updated user');
        $scope.resetForm();
        WizardHandler.wizard().goTo(0);
        return user;
    }, 
    function(error) {
        logger.logError('Ups an error has occurred');
        console.error('error updating user: ' + error);
    }
); 

promise.then(function(user) {
    _.each(uploader.getNotUploadedItems(), function(item) {
        return item.formData.push({
            id: user.id
        });
    });
});

第二个 then 将被执行

我不知道为什么,我的意思是这不只是常规链接吗?

【问题讨论】:

    标签: javascript promise chaining


    【解决方案1】:

    如果 updateUser 失败,将显示日志,然后第二个则不会执行

    是的,因为你正在分支:

                  success: - logSuccessAndResetForm()
                   |       - makeNewFormData()
    updateUser() --+
      promise      |
                  error    - logError()
    

    但是当使用常规链接时,第二个链将被执行

    是的,当然。您的错误处理程序处理错误,promise 由返回值实现。

                  success: - logSuccessAndResetForm()           success: - makeNewFormData()
                   |                               \             |
    updateUser() --+                                >- promise --+
                   |                               /             |
                  error    - logError()           ´             error:   (nothing)
    

    另请参阅this answer 以获得更漂亮的类似代码的控制流程图。

    【讨论】:

    • 对于任何试图遵循这一点的人的脚注:Bergi 所说的对于 js 原生 Promise 和大多数主流 Promise 库都是正确的。但是注意 jQuery 承诺,它们的行为不同。在 jQuery 中,.then 的错误处理程序将下游的 Promise 标记为“已处理”仅当它显式返回一个被拒绝的 Promise。自然行为是传播错误状态。因此,问题中的代码版本都不会触发第二个 then 的成功处理程序。另请注意,jQuery 的人们可能会在未来的某个时候规范这种行为。
    • @Roamer-1888: That's not their only problem,但我真的不想在每个带有承诺标签的问题上链接该帖子。 jQuery deferreds 不是正确的承诺,点:-)
    • Bergi,我同意,你不能每次都提供“jQuery proviso”。但是您的图表使这个答案非常清晰和引人注目——它可能会被很多人阅读。
    • 公平地说,他们正在修复它,事实上,他们在几天前将修复合并到了他们的主分支,并且在不久的 3.0 中,问题以及时间问题都得到了修复: )
    • @Bergi .then() 然后返回另一个承诺而不是原来的承诺?是这样吗,我想我需要阅读更多关于承诺的内容才能完全掌握它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 2019-03-31
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多