Действие Vuex, возвращающее обещание jQuery, не работает,. fail-это не функция
У меня есть такое действие vuex
myAction() {
const deferred = $.Deferred();
setTimeout(() => deferred.resolve(), 3000);
return deferred.promise();
}
в моем компоненте vue
myMethod() {
this.myAction().fail(() => ...do something...);
}
кидает ошибку:
Неперехваченный TypeError: это.myAction (...). fail-это не функция
Код работал нормально, но проблема появилась, как только я обновил свои модули npm/vue-cli/webpack и т. д. Другой момент заключается в том, что если я изменю .fail
на .catch
, то он будет работать нормально. Но вопрос в том, почему .fail
не работает?
Ответы - Действие Vuex, возвращающее обещание jQuery, не работает,. fail-это не функция / Vuex action returning jQuery promise doesn't work, .fail is not a function

14.11.2020 07:38:27
Начиная с Vuex 3.4.0, действия всегда возвращают собственное обещание. В прошлых версиях Vuex только проверял, возвращает ли действие объект thennable, то есть что-либо со свойством .then
. Если нет, то он завернул возвращаемое значение действия в новое обещание. Но если это так, он просто вернул объект, не обернув его, предполагая, что это было обещание. Начиная с версии 3.4.0, Vuex обертывает даже те объекты, которые можно использовать.
Таким образом, в прошлом обещание $.Deferred
могло проскользнуть мимо, потому что у него есть метод .then
, который возвращает объект обещания $
с методом .fail
. Но теперь она обернута в туземное обещание.
регистрация
Если вы проверите источник Vuex, то увидите, что registerAction
не изменился с 3.3.0 на 3.4.0. именно здесь не подлежащие возврату значения завернуты в обещания. Ничего не изменилось:
function registerAction (store, type, handler, local) {
...
if (!isPromise(res)) {
res = Promise.resolve(res);
}
...
}
магазин.отправка.прототип
Но store.dispatch.prototype
действительно изменился. Раньше он просто возвращал метод .then
:
return result.then(function (res) {
...
})
Но теперь он всегда возвращает обертку обещания:
$.Deferred
0
И обертка тоже не утруждает себя возвращением внутреннего результата. Похоже, Vuex решил нормализовать возвращаемое значение действий так, чтобы оно гарантированно было родным обещанием.