【问题标题】:Function Automatically Called Inside Javascript PromiseJavascript Promise 中自动调用的函数
【发布时间】:2015-05-13 23:19:57
【问题描述】:

我对 Javascript 承诺相当陌生,遇到了一个我无法通过 Google 或 Stack Exchange 找到任何相关信息的问题。当我在 .then 中引用一个函数时,我有时必须将该函数包装在一个匿名函数中,以阻止它在原始 Promise 被解决之前自动执行。例如,如果我的代码是

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

在我解决来自 dialogService.Confirm 的承诺之前,对 adserService.deleteAdvertiser 的调用将自动触发。但是,如果我把它写成

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

它的行为符合预期:在我解决 dialogService.Confirm 承诺(在这种情况下,通过单击确认对话框中的“删除”按钮)之前,advertiserService.deleteAdvertiser 调用不会发生。

dialogService 使用 ngDialog 的 .openConfirm 方法,该方法返回一个承诺。我已验证此承诺正确返回。关于为什么会发生这种情况,我最好的猜测是我需要从 UI 传递一个广告商对象(该函数最初是通过 ng-click 垃圾箱按钮调用的)意味着我必须调用 adserService.deleteAdvertiser(advertiser )——也就是说,传入一个参数——这反过来意味着 JS 在读取它时立即执行该函数调用,而不是仅仅存储引用以供稍后在解决初始承诺时使用。

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

谢谢!

【问题讨论】:

  • 好吧,你也不会.then(getAdvertisers()),对吗?

标签: javascript angularjs angular-promise ng-dialog


【解决方案1】:

通过传入的参数,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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    相关资源
    最近更新 更多