Почему Саудовская Сага не бросает исключение в вызове
У меня есть следующая простая сага в моем приложении "родной":
import {call, put, take} from 'redux-saga/effects';
import firebase from 'react-native-firebase';
export function* signupWithEmailPassword(action: AuthAction) {
const {email, password} = action.payload;
try {
const user = yield call(doRegister, email, password);
yield put({type: 'SIGNUP_SUCCESS', payload: user});
} catch (error) {
yield put({type: 'SIGNUP_FAILURE', error});
}
}
function* doRegister(email: string, password: string) {
return firebase.auth().createUserAndRetrieveDataWithEmailAndPassword(email, password)
.catch((error) => {
const {code, message} = error;
console.log('in doRegister: error ' + code + ' - ' + message);
});
}
если сага вызывается с неверным адресом электронной почты, firebase выдаст ошибку типа "auth/invalid-email". Это нормально и ожидаемо, но по какой-то причине yield call(doRegister, email, password);
не подведет и, следовательно, yield put({type: 'SIGNUP_SUCCESS', payload: user});
называется, хотя он должен отступить к catch
,
Что я делаю неправильно?
редактировать:
изменения doRegister
к этому, вызывает те же проблемы:
function* doRegister(email: string, password: string) {
return firebase.auth().createUserAndRetrieveDataWithEmailAndPassword(email, password);
}
1 ответ
Смени сагу
function* doRegister(email: string, password: string) {
const response= yield firebase.auth().createUserAndRetrieveDataWithEmailAndPassword(email, password);
return response; /*this will ensure it does not return before you get the response*/
}
Вот так у меня получилось на работу
export function* loginREST( email, password ) {
// change this to whatever firebase call you need
return yield call(
[ firebase.auth(), firebase.auth().signInWithEmailAndPassword ],
email,
password,
);
}
export function* login( action ) {
try {
const response = yield call(
loginREST,
action.payload.email,
action.payload.email,
);
const { email, uid } = response.user;
// for some weird reason passing back the entire response object gave
// me an infinite loop so I fixed that by only passing the stuff I need
yield put( loginSuccessAction( { email, uid } ) );
}
catch ( error ) {
yield put( loginFailedAction( error ) );
}
}
В ваших сагах:
export function* signupWithEmailPassword({email , password}) {
try {
const user = yield call(doRegister, email, password);
yield put({type: 'SIGNUP_SUCCESS', payload: user});
} catch (error) {
yield put({type: 'SIGNUP_FAILURE', error});
}
}
Если есть какая-либо ошибка, например, электронное письмо плохо отформатировано, используйте обрезку, например
export function* signupWithEmailPassword({email , password}) {
try {
const user = yield call(doRegister, email.trim(), password);
yield put({type: 'SIGNUP_SUCCESS', payload: user});
} catch (error) {
yield put({type: 'SIGNUP_FAILURE', error});
}
}