【发布时间】:2018-08-11 19:14:00
【问题描述】:
我有一个 saga(使用 redux-saga)调用一个 POST 到 API 端点的函数(使用 axios)。通过 axios 进行更深层次的 API 调用会返回一个 Promise。我想在promise 的then() 方法中调度操作,但我显然不能使用yield。 put() 似乎没有放任何东西。这样做的正确方法是什么?
这是传奇:
export function* loginFlow(action) {
try {
const {username, password} = action.payload;
const responsePromise = yield call(login, {username, password, isRegistering: false});
yield responsePromise
.then(result => {
console.log('loginFlow responsePromise result', result);
put(creators.queueLoginSucceededAction()); // doesn't work
put(push('/')); // doesn't work
})
.catch(err => {
console.log('loginFlow responsePromise err', err);
put(creators.queueLoginFailedAction()); // doesn't work
});
}
catch(err) {
console.log(err);
yield put(creators.queueLoginFailedAction());
}
}
这是被调用的函数:
export function* login(options) {
try {
// if we are already logged in, via token in local storage,
// then skip checking against server
if( store.get('token') ) {
return Promise.resolve('Already logged in.');
}
// query server for valid login, returns a JWT token to store
const hash = yield bcrypt.hashSync(options.password, 10);
yield put(creators.queueLoginHttpPostedAction());
return axios.post('/auth/local', {
params: {
username: options.username,
password: hash,
hash: true,
}
})
.then(result => {
console.log('api>auth>login>result', result);
put(creators.queueLoginHttpSucceededAction()); // doesn't work
return Promise.resolve('Login successful');
})
.catch(err => {
console.log('api>auth>login>err', err);
put(creators.queueLoginHttpFailedAction()); // doesn't work
return Promise.reject(err.message);
});
}
catch (err) {
yield put(creators.queueLoginHttpFailedAction());
return Promise.reject('Login could not execute');
}
}
【问题讨论】:
-
如果你
yield承诺 redux-saga 会等待它并给你响应,所以这行:const responsePromise = yield call(login, {username, password, isRegistering: false});实际上应该是const result = yield call(login, {username, password, isRegistering: false});。所以你真的不需要使用then。
标签: redux promise react-redux redux-saga