Reactjs 从saga制作模板:在函数中包装saga的一部分

Reactjs 从saga制作模板:在函数中包装saga的一部分,reactjs,redux,react-redux,redux-saga,Reactjs,Redux,React Redux,Redux Saga,我需要像佐贺模板-包装的一部分佐贺在功能。我这样做是因为我的许多传奇都有类似的结构,我试图分解这些代码。请不要关注细节,请给我大致的看法。我在调用类似模板的函数时遇到问题 我想这样做: function* signInSaga({ payload: { email, password } }) { const signUpBodyRequest = { 'email': email, 'password': password, }; try { const

我需要像佐贺模板-包装的一部分佐贺在功能。我这样做是因为我的许多传奇都有类似的结构,我试图分解这些代码。请不要关注细节,请给我大致的看法。我在调用类似模板的函数时遇到问题

我想这样做:

function* signInSaga({ payload: { email, password } }) {
  const signUpBodyRequest = {
    'email': email,
    'password': password,
  };

  try {
    const formData = new FormData();
    formData.append('email', email);
    formData.append('password', password);
    yield put(actions.requestSignIn());
    const data = yield call(() => {
      return fetch('test.url/sign_in', {
        method: 'POST',
        body: formData
      }).then(function(response) {
        return response.json();
      });
    });
    if (data.token) {
      yield put(actions.requestSignInSuccess(data));
    } else {
      yield put(actions.requestSignInError());
    }
  } catch (error) {
    yield put(actions.requestSignInError());
  }
}
 function* signInSaga({ payload: { email, password } }) {
  const signInBodyRequest = {
    'email': email,
    'password': password
  };
  sagaTemplate(
    'test.url/sign_in',
    actions.requestSignIn,
    actions.requestSignInSuccess,
    actions.requestSignInError,
    'POST',
    signInBodyRequest
  );
}
要喜欢这个:

function* signInSaga({ payload: { email, password } }) {
  const signUpBodyRequest = {
    'email': email,
    'password': password,
  };

  try {
    const formData = new FormData();
    formData.append('email', email);
    formData.append('password', password);
    yield put(actions.requestSignIn());
    const data = yield call(() => {
      return fetch('test.url/sign_in', {
        method: 'POST',
        body: formData
      }).then(function(response) {
        return response.json();
      });
    });
    if (data.token) {
      yield put(actions.requestSignInSuccess(data));
    } else {
      yield put(actions.requestSignInError());
    }
  } catch (error) {
    yield put(actions.requestSignInError());
  }
}
 function* signInSaga({ payload: { email, password } }) {
  const signInBodyRequest = {
    'email': email,
    'password': password
  };
  sagaTemplate(
    'test.url/sign_in',
    actions.requestSignIn,
    actions.requestSignInSuccess,
    actions.requestSignInError,
    'POST',
    signInBodyRequest
  );
}
现在我的传奇模板看下一步:

import { call, put } from 'redux-saga/effects';

export function* sagaTemplate(url, request, requestSucces, requestError, method, bodyRequest) {
  try {
    const formData = new FormData();
    for (let [key, value] of Object.entries(bodyRequest)) {
      formData.append(key, value);
    }
    yield put(request());
    const data = yield call(() => {
      return fetch(url, {
        method: method,
        body: formData
      }).then(function(response) {
        return response.json();
      });
    });
    if (data.token) {
      yield put(requestSucces(data));
    } else {
      yield put(requestError());
    }
  } catch (error) {
    yield put(requestError());
  }
}

如何正确地在saga中调用我的函数模板?

有两件事,一件是使用saga effect调用,该调用获取要调用的函数,然后是以逗号分隔的参数列表

yield call(sagaTemplate, arguments, in, their, correct, order);
其次,我建议发送一个对象,它可以被解构,它包含所有的参数,将混合参数顺序的可能性保持为零