在 Javascript Promise 中自动调用的函数
Function Automatically Called Inside Javascript Promise
我对 Javascript promises 还很陌生,运行 遇到了一个我无法通过 Google 或 Stack Exchange 找到任何问题的问题。当我引用 .then 中的一个函数时,链接了一个 promise,有时我不得不将该函数包装在一个匿名函数中,以阻止它在原始 promise 得到解决之前自动执行。例如,如果我的代码是
function deleteAdvertiser(advertiser) {
dialogService.Confirm(null, 'Delete')
.then(advertiserService.deleteAdvertiser(advertiser))
.then(getAdvertisers);
}
在我解决来自 dialogService.Confirm 的承诺之前,对 advertiserService.deleteAdvertiser 的调用将自动触发。但是,如果我把它写成
function deleteAdvertiser(advertiser) {
dialogService.Confirm(null, 'Delete')
.then(function () {
advertiserService.deleteAdvertiser(advertiser)
.then(getAdvertisers);
});
}
它的行为符合预期:在我解决 dialogService.Confirm 承诺之前,advertiserService.deleteAdvertiser 调用不会发生(在这种情况下,通过单击确认对话框中的 "Delete" 按钮)。
dialogService 使用 ngDialog 的 .openConfirm 方法,returns 一个承诺。我已验证此承诺已正确返回。关于为什么会发生这种情况,我最好的猜测是我需要从 UI 传递广告商对象(该函数最初是通过 ng-click 垃圾桶按钮调用的)意味着我必须调用 advertiserService.deleteAdvertiser(advertiser)--也就是说,传入一个参数--这反过来意味着JS在读取它时立即执行该函数调用,而不是仅存储引用以供以后使用最初的承诺已解决。
我对为什么第一个代码块不起作用的理解是否正确?为什么将其包装在匿名函数中会有所不同?是否有正确(或至少更好)的方式来链接这些承诺?
谢谢!
with an argument passed in, JS is executing that function call as soon as it reads it
是的。当您传递参数并将 ()
放在函数后面时, 您正在调用它 。你需要传递一个函数 - 就像你做 .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);
我对 Javascript promises 还很陌生,运行 遇到了一个我无法通过 Google 或 Stack Exchange 找到任何问题的问题。当我引用 .then 中的一个函数时,链接了一个 promise,有时我不得不将该函数包装在一个匿名函数中,以阻止它在原始 promise 得到解决之前自动执行。例如,如果我的代码是
function deleteAdvertiser(advertiser) {
dialogService.Confirm(null, 'Delete')
.then(advertiserService.deleteAdvertiser(advertiser))
.then(getAdvertisers);
}
在我解决来自 dialogService.Confirm 的承诺之前,对 advertiserService.deleteAdvertiser 的调用将自动触发。但是,如果我把它写成
function deleteAdvertiser(advertiser) {
dialogService.Confirm(null, 'Delete')
.then(function () {
advertiserService.deleteAdvertiser(advertiser)
.then(getAdvertisers);
});
}
它的行为符合预期:在我解决 dialogService.Confirm 承诺之前,advertiserService.deleteAdvertiser 调用不会发生(在这种情况下,通过单击确认对话框中的 "Delete" 按钮)。
dialogService 使用 ngDialog 的 .openConfirm 方法,returns 一个承诺。我已验证此承诺已正确返回。关于为什么会发生这种情况,我最好的猜测是我需要从 UI 传递广告商对象(该函数最初是通过 ng-click 垃圾桶按钮调用的)意味着我必须调用 advertiserService.deleteAdvertiser(advertiser)--也就是说,传入一个参数--这反过来意味着JS在读取它时立即执行该函数调用,而不是仅存储引用以供以后使用最初的承诺已解决。
我对为什么第一个代码块不起作用的理解是否正确?为什么将其包装在匿名函数中会有所不同?是否有正确(或至少更好)的方式来链接这些承诺?
谢谢!
with an argument passed in, JS is executing that function call as soon as it reads it
是的。当您传递参数并将 ()
放在函数后面时, 您正在调用它 。你需要传递一个函数 - 就像你做 .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);