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