函数自动调用Javascript承诺

时间:2015-05-13 15:12:32

标签: javascript angularjs angular-promise ng-dialog

我对Javascript承诺相当新,遇到了一个我无法通过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承诺(在这种情况下,通过单击确认对话框中的“删除”按钮)之前,adsiserService.deleteAdvertiser调用才会发生。

dialogService使用ngDialog的.openConfirm方法,该方法返回一个promise。我已经证实这个承诺正确地回归了。关于为什么会发生这种情况我最好的猜测是我需要从UI传递广告客户对象(该功能最初是通过点击垃圾桶按钮来调用)意味着我必须调用advertiserService.deleteAdvertiser(广告客户) ) - 也就是说,传入一个参数 - 这反过来意味着JS在读取它时立即执行该函数调用,而不是仅仅存储引用以便在解决初始承诺时使用。 / p>

我是否理解为什么第一个代码块不起作用?为什么将它包装在匿名函数中会有所不同?是否有正确(或至少更好)的方式来链接这些承诺?

谢谢!

1 个答案:

答案 0 :(得分:3)

  

传入一个参数,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);