【问题标题】:Abort a promise chain without raising an error [duplicate]中止承诺链而不引发错误[重复]
【发布时间】:2016-06-16 05:34:39
【问题描述】:

使用 When.js,由于用户改变主意,我们想要在中途悄悄中止承诺链。我们当前的方法是永远不解决链中的那一步——有效地让其他承诺“悬而未决”。这好像有点脏?

如果我们拒绝承诺,那么我们的异常处理程序当然会启动。我们可以使用我们检测并忽略的自定义消息来解决这个问题,但这似乎也有点不干净。

有更好的方法吗?

这就是代码的样子:

    return getConfirmation(confirmConversion, 'Ready to upload your file to the ' + terria.appName + ' conversion service?')
        .then(function() { 
            return loadItem(createCatalogMemberFromType('ogr', terria), name, fileOrUrl); 
        });


function getConfirmation(confirmConversion, message) {
    ...
    var d = when.defer(); // there's no `when.promise(resolver)` in when 1.7.1
    PopupMessageConfirmationViewModel.open('ui', { 
        ...
        confirmAction: d.resolve,
        denyAction: function() { this.close(); /* Do nothing or d.reject(); ? */ }
    });
    return d.promise;
}

结果

为了完整起见,我将代码更改为:

    confirmAction: function () { d.resolve(true); },
    enableDeny: true,
    denyAction: function() { this.close(); d.resolve(false); }

        .then(function(confirmed) { 
            return confirmed ? loadItem(createCatalogMemberFromType('ogr', terria), name, fileOrUrl) : undefined; 
        });

【问题讨论】:

  • 如果您尝试返回三种可能的状态(解决、拒绝和用户取消)以便您的代码可以正确处理所有三种可能的解决方案并且您正在使用 Promise,那么您将不得不已解决的值表示用户取消或拒绝原因必须指示取消,您的代码必须检查这一点。承诺只有两种可能的最终状态,而不是三种,因此您必须在其他两种状态之一中传达第三种状态。
  • 是的,好的,这有帮助。所以要么我们(ab)使用“pending”作为“final”状态,要么我们需要另一个返回值。
  • 如果你回答它,很高兴接受它作为答案。
  • 我建议resolve 使用truefalse(就像经典confirm(…) 的返回值一样)。然后您可以基于此在您的then 回调中进行分支,有关详细信息,请参阅链接的副本。编辑:嘿,正是您在该编辑中发布的方式:-)
  • 如果您愿意尝试 bluebird 而不是何时尝试,它提供取消支持,可让您直接执行此操作。

标签: promise abort when-js


【解决方案1】:

将我的评论变成答案:

如果您尝试返回三种可能的状态(解决、拒绝和用户取消),以便您的代码可以正确处理所有三种可能的解决方案并且您正在使用 Promise,那么您必须使已解决的值表明用户取消或拒绝原因必须表明取消,您的代码必须检查这一点。

promise 只有两种可能的最终状态,而不是三种,因此您必须在其他两种状态之一中传达第三种状态。

我建议不要将 Promise 搁置在待处理状态,除非您绝对确定它们不会导致内存泄漏,但即便如此,将它们搁置似乎也不是一个非常干净的设计。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 2017-03-04
相关资源
最近更新 更多