Проблема в том, что у меня есть несколько входов и одна кнопка для сохранения данных. У меня есть этот метод в моем компоненте в реакции:
handleClick(e) {
e.preventDefault();
this.props.newEmail ? this.props.onSaveNewEmail(this.props.newEmail) : null;
this.props.newName ? this.props.onSaveNewName(this.props.newName) : null;
}
И этот метод отражен в моей саге о редуксе:
export function* isName() {
const name = yield select(makeNewNameSelector());
...
// validation name
if (!re.test(name)) {
...
} else {
// ! OK, I CAN UPDATE NAME BECAUSE NEW NAME IS OK
}
}
export function* isEmail() {
const email = yield select(makeNewEmailSelector());
const requestURL = `/api/users/isEmail/${email}`;
...
// validation email
if (!re.test(email)) {
...
} else {
try {
const response = yield call(request, requestURL);
if (!response.isEmail) {
// ! OK, I CAN UPDATE EMAIL BECAUSE IT DOESN'T HAVE IN MY DB MYSQL
}
} catch (err) {
...
}
}
}
// this method send request PUT and this can update data:
function* saveData() {
const name = yield select(makeNewNameSelector());
const email = yield select(makeNewEmailSelector());
...
try {
const response = yield call(request, requestURL, {
method: 'PUT',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
Authorization: `Bearer ${jwt}`,
},
body: JSON.stringify({
name,
email,
}),
});
if (response.success) {
name ? yield put(enterNewNameSuccessAction()) : null;
email ? yield put(enterNewEmailSuccessAction()) : null;
yield put(saveDataSuccessAction());
}
} catch (err) {
...
}
}
export default function* settingsPageSaga() {
yield takeLatest(ENTER_NEW_NAME, isName);
yield takeLatest(ENTER_NEW_EMAIL, isEmail);
}
А теперь как мне вызвать мой saveData()
метод только один раз?
Если вместо комментариев я поставлю yield call(saveData)
, он будет работать, но это отправит два запроса ! Я хотел бы отправить только один запрос PUT.
и если я хочу изменить адрес электронной почты, я должен подождать, пока мой код проверит, существует ли такой адрес электронной почты в базе данных. если нет, то измените только действие.