JavaScript можем ли мы перенести то, что должно быть внутри then (), в метод с параметрами и вызвать его - PullRequest
0 голосов
/ 15 апреля 2020

Как я могу избежать повторения кода в then (), когда я обрабатываю обратный вызов? Это модуль vuex для входа и регистрации пользователя

    login({ commit }, user) {
        return AuthService.login(user).then(
            user => {
                commit('loginSuccess', user);
                return Promise.resolve(user);
            },
            error => {
                commit('loginFailure');
                return Promise.reject(error);
            }
        );
    },
    register({ commit }, user) {
        return AuthService.register(user).then(
            response => {
                commit('registerSuccess');
                return Promise.resolve(response.data);
            },
            error => {
                commit('registerFailure');
                return Promise.reject(error);
            }
        );
    }

Я хотел бы сделать функцию с параметрами, подобными которым, она получает мутацию Имена и ручки Promse

function handleCallback(strMutationName1,strMutationName2, response, error) {
    response => {
       commit(strMutationName1, response.data)
       return Promise.resolve(response.data);
    },
    error => {
       commit(strMutationName2);
       return Promise.reject(error)
    }
}
And call previous methods like this 
    login({ commit }, user) {
        return AuthService.login(user).then(
            handleCallback('loginSuccess','loginFailure', response, error)
        );
    },
    register({ commit }, user) {
        return AuthService.register(user).then(
            handleCallback('registerSuccess','registerFailure', response, error)
        );
    }

1 Ответ

0 голосов
/ 15 апреля 2020

Нет, then имеет два параметра, поэтому вам нужно создать две функции:

function successCallback(commit, name) {
    return response => {
        commit(name, response)
        return Promise.resolve(response);
    };
}
function failureCallback(commit, name) {
    return error => {
        commit(name)
        return Promise.reject(error);
    };
}

Затем вызывать их как

login({ commit }, user) {
    return AuthService.login(user).then(successCallback(commit, 'loginSuccess'), failureCallback(commit, 'loginFailure'));
},
register({ commit }, user) {
    return AuthService.register(user).then(successCallback(commit, 'registerSuccess'), failureCallback(commit, 'registerFailure'));
}

Чтобы создать одного помощника, вы должны либо оберните весь then обратный вызов

function handle(commit, name, promise) {
    return promise.then(successCallback(commit, name+'Success'), failureCallback(commit, name+'Failure');
}

login({ commit }, user) {
    return handle(commit, 'login', AuthService.login(user));
},
register({ commit }, user) {
    return handle(commit, 'register', AuthService.register(user));
}

или используйте синтаксис расширения в вызове и верните кортеж из помощника:

function handleCallbacks(commit, name) {
    return [successCallback(commit, name+'Success'), failureCallback(commit, name+'Failure')];
}

login({ commit }, user) {
    return AuthService.login(user).then(...handleCallbacks(commit, 'login'));
},
register({ commit }, user) {
    return AuthService.register(user).then(...handleCallbacks(commit, 'register'));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...