When.js を使用すると、ユーザーの気が変わったために、promise チェーンを途中で静かに中止したい状況があります。私たちの現在の方法は、チェーンのそのステップを決して解決しないことです - 事実上、他のプロミスを「ぶら下げ」たままにします。これは少し汚れているように見えますか?
promise を拒否すると、もちろん例外ハンドラが起動します。検出して無視するカスタム メッセージを使用して回避することもできますが、これも少し不潔に思えます。
より良いアプローチはありますか?
コードは次のようになります。
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;
});