Действие Vuex, возвращающее обещание jQuery, не работает,. fail-это не функция


Действие Vuex, возвращающее обещание jQuery, не работает,. fail-это не функция

13.11.2020 07:49:37 Просмотров 9 Источник

У меня есть такое действие 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

Является ответом!
Dan

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) {
  ...
})

Но теперь он всегда возвращает обертку обещания:

$.Deferred0

И обертка тоже не утруждает себя возвращением внутреннего результата. Похоже, Vuex решил нормализовать возвращаемое значение действий так, чтобы оно гарантированно было родным обещанием.

Помочь в развитии проекта:
Закрыть X