私は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 が解決されたときに使用する参照を保存するのではなく、読み取るとすぐにその関数呼び出しを実行することを意味します。
最初のコード ブロックが機能しない理由について、私の理解は正しいでしょうか? 匿名関数でラップすると違いが生じるのはなぜですか? そして、これらの約束を連鎖させる正しい(または少なくともより良い)方法はありますか?
ありがとうございました!