Я новичок в обещаниях 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 выполняет этот вызов функции, как только он его читает, а не просто сохраняет ссылку для использования позже, когда исходное обещание разрешено.
Правильно ли я понимаю, почему первый блок кода не работает? Почему обертывание его в анонимную функцию имеет значение? И есть ли правильный (или, по крайней мере, лучший) способ связать эти промисы?
Благодарю вас!
.then(getAdvertisers())
, не так ли? - person Bergi   schedule 13.05.2015