-1

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; 
        });
4

1 に答える 1

1

私のコメントを答えにする:

3 つの可能な状態 (解決、拒否、ユーザーによるキャンセル) を返そうとしていて、コードが 3 つの可能なすべての解決を正しく処理できるようにし、promise を使用している場合は、解決された値がユーザーがキャンセルしたことを示すようにする必要があります。または拒否理由はキャンセルを示す必要があり、コードはそれを確認する必要があります。

promise の最終状態は 3 つではなく 2 つしかないため、残りの 2 つのいずれかで 3 番目の状態を伝える必要があります。

保留中の状態で約束を取り残さないことをお勧めしますが、メモリ リークが発生しないことが絶対に確実でない限り、取り残さないようにすることは非常にきれいな設計のようには思えません。

于 2016-03-03T04:06:49.567 に答える