中止承诺链而不会引发错误

时间:2016-03-03 03:56:51

标签: promise abort when-js

使用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; 
        });

1 个答案:

答案 0 :(得分:1)

将我的评论写成答案:

如果您尝试返回三种可能的状态(解析,拒绝和用户取消),那么您的代码可以正确处理所有三种可能的解决方案并且您正在使用承诺,那么您将不得不已解决的值表示用户已取消或拒绝原因必须指示取消,您的代码必须检查该内容。

承诺只有两种可能的最终状态,而不是三种,所以你必须在另外两种状态中传达第三种状态。

我建议不要在待决状态下搁置承诺,除非你绝对确定他们不会导致内存泄漏,但即便如此,它看起来也不是很干净设计只是为了它们。