Как мне написать универсальные обработчики обещаний многократного использования затем / catch? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть несколько вызовов к конечным точкам json, которые выглядят примерно так. Это в контексте компонента Vue, но на самом деле это не имеет большого значения. Все, что делают эти обработчики, это отображает сообщение начальной загрузки с успехом / ошибкой, все смарты находятся на сервере.

Так что это на самом деле не так уж и отличается от всех этих обработчиков console.log("it worked!"), за исключением того, что моим обработчикам нужны дополнительные аргументы.

//The Vue component
let myVue = this;

axios.post(this.action_url, qs.stringify(data), config)
.then(function (response) {
      // it's a bit more complicated as it looks at response contents
      // for the actual message
      myVue.$root.$emit(base_messages.EV_USER_MESSAGE, "success");
    });

})
.catch(function (error) {
      myVue.$root.$emit(base_messages.EV_USER_MESSAGE, "failure");
});

в другом месте ...

let myVue = this;

axios.post(another_url, qs.stringify(data2), config2)
.then(function (response) {
      myVue.$root.$emit(base_messages.EV_USER_MESSAGE, "success");
    });
.catch ....

})

Я бы хотел написать код ответа и обработчик ошибок один раз и использовать их повторно. Но, поскольку мне нужно что-то узнать из контекста выполнения, в данном случае myVue, я не могу просто импортировать функцию и передать ответ, или я что-то упустил?

function handleResponse(response){
    // ?? I need extra contextual variables, not just response
    myVue.$root.$emit(base_messages.EV_USER_MESSAGE, "success");
};

, которыйЕсли бы это работало, я мог бы использовать как

axios.post(this.action_url, qs.stringify(data), config)
.then(handleResponse(response))
.catch(someErrorhandler(error));

вместо того, чтобы повторять замыкание с одинаковым содержимым каждый раз.

Исходя из Python, я думаю, может быть карри (предварительно присваивая аргумент вызову функции, в этом случае myVue или {myVue: myVue}) может это сделать, но каков идиоматический способ JS для достижения повторного использования обработчика, если обработчики идентичны? Все, что использует встроенный es6, предпочтительнее, чем добавление дополнительных зависимостей, таких как Lodash.

1 Ответ

1 голос
/ 08 ноября 2019

Вы были на правильном пути с карри:

function handleResponse(myVue) {
  return function handleResponse(response){

    myVue.$root.$emit(base_messages.EV_USER_MESSAGE, "success");
  };
}

для использования в качестве

axiosPromise.then(handleResponse(myVue));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...