3

私はJavascriptの約束にかなり慣れていないので、GoogleまたはStack Exchangeを介して何も追跡できないという問題に直面しています。プロミスからチェーンされた .then で関数を参照する場合、元のプロミスが解決される前に自動的に実行されるのを停止するために、その関数を無名関数でラップする必要がある場合があります。たとえば、私のコードが

function deleteAdvertiser(advertiser) {
    dialogService.Confirm(null, 'Delete')
        .then(advertiserService.deleteAdvertiser(advertiser))
        .then(getAdvertisers);
}

dialogService.Confirm から Promise を解決する前に、advertiserService.deleteAdvertiser への呼び出しが自動的に発生します。ただし、次のように書くと

function deleteAdvertiser(advertiser) {
    dialogService.Confirm(null, 'Delete')
        .then(function () {
            advertiserService.deleteAdvertiser(advertiser)
                .then(getAdvertisers);
            });
}

期待どおりに動作します。advertiserService.deleteAdvertiser の呼び出しは、dialogService.Confirm の約束を解決するまで発生しません (この場合は、確認ダイアログ内の [削除] ボタンをクリックします)。

dialogService は、promise を返す ngDialog の .openConfirm メソッドを使用します。この promise が正しく返されることを確認しました。なぜこれが起こっているのかについての私の最善の推測は、UI から広告主オブジェクトを渡す必要があるということです (関数は最初にごみ箱ボタンの ng-click を介して呼び出されます)、advertiserService.deleteAdvertiser(advertiser )-- つまり、引数が渡されます-- つまり、JS は、後で最初の promise が解決されたときに使用する参照を保存するのではなく、読み取るとすぐにその関数呼び出しを実行することを意味します。

最初のコード ブロックが機能しない理由について、私の理解は正しいでしょうか? 匿名関数でラップすると違いが生じるのはなぜですか? そして、これらの約束を連鎖させる正しい(または少なくともより良い)方法はありますか?

ありがとうございました!

4

1 に答える 1

4

引数が渡されると、JS はそれを読み取るとすぐにその関数呼び出しを実行します

はい。()引数を渡し、関数の後ろに置くと、それを呼び出しています。.then(getAdvertisers)代わりに関数を渡す必要があります - の代わりに行うのと同じです.then(getAdvertisers())

関数式である必要はないことに注意してください.bind。同様に使用できます。

dialogService.Confirm(null, 'Delete')
    .then(advertiserService.deleteAdvertiser.bind(advertiserService, advertiser))
    .then(getAdvertisers);

これはほぼ同等です

dialogService.Confirm(null, 'Delete')
    .then(function(confirmRes) {
        return advertiserService.deleteAdvertiser(advertiser);
    })
    .then(getAdvertisers);
于 2015-05-13T15:19:57.000 に答える