Функция автоматически вызывается внутри обещания Javascript

Я новичок в обещаниях Javascript и столкнулся с проблемой, о которой я не могу ничего узнать через Google или Stack Exchange. Когда я ссылаюсь на функцию в .then связанном обещании, мне иногда приходится оборачивать эту функцию в анонимную функцию, чтобы предотвратить ее автоматическое выполнение до того, как исходное обещание будет разрешено. Например, если мой код

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

вызов adsrService.deleteAdvertiser будет автоматически срабатывать до того, как я решу обещание из dialogService.Confirm. Однако, если я напишу это как

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

он ведет себя так, как ожидалось: вызов adsrService.deleteAdvertiser не происходит, пока я не разрешаю обещание dialogService.Confirm (в этом случае, нажав кнопку «Удалить» в моем диалоговом окне подтверждения).

DialogService использует метод .openConfirm ngDialog, который возвращает обещание. Я проверил, что это обещание возвращается правильно. Мое лучшее предположение о том, почему это происходит, заключается в том, что мне нужно передать объект рекламодателя из пользовательского интерфейса (функция изначально вызывается с помощью ng-щелчка на кнопке корзины) означает, что я должен вызвать adsrService.deleteAdvertiser(advertiser ) — то есть с переданным аргументом — что, в свою очередь, означает, что JS выполняет этот вызов функции, как только он его читает, а не просто сохраняет ссылку для использования позже, когда исходное обещание разрешено.

Правильно ли я понимаю, почему первый блок кода не работает? Почему обертывание его в анонимную функцию имеет значение? И есть ли правильный (или, по крайней мере, лучший) способ связать эти промисы?

Благодарю вас!


person nwebb    schedule 13.05.2015    source источник
comment
Ну, ты бы тоже не стал делать .then(getAdvertisers()), не так ли?   -  person Bergi    schedule 13.05.2015
comment
Я бы не стал, но я не уверен, как еще сделать то, что мне нужно, вызвав AdvertisingrService.deleteAdvertiser(advertiser) с передачей аргумента.   -  person nwebb    schedule 13.05.2015


Ответы (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);
person Bergi    schedule 13.05.2015