gpt4 book ai didi

javascript - Redux-saga 无法在 Promise 中使用生成器函数?

转载 作者:行者123 更新时间:2023-12-01 01:49:03 25 4
gpt4 key购买 nike

我是 redux-saga 的新手。目前我正在研究一个简单的登录示例。看看这些函数:

function sendLoginRequest(data) {
const headers = { 'Accept': 'application/json' };
const url = LOGIN_URL;
const serialize = new FormData(data.event.target);
const loginData = {
username: serialize.get('email'),
password: serialize.get('password'),
client_secret: APP_SECRET_KEY,
client_id: APP_SECRET_ID,
grant_type: PASSWORD_GRANT_TYPE,
scope: '*',
}

return axios({
method: 'POST',
url: url,
data: loginData,
headers: headers,
});
}

export function* loginRequest(data) {
yield takeLatest(LOGIN_REQUEST, data => {
const response = sendLoginRequest(data);
console.log(response);
response
.then(function* (data) {
console.log(data);
yield put(LOGIN_SUCCESS, data.data);
})
.catch(function* (err) {
console.log(err);
yield put(LOGIN_FAILURE, err.response);
});
});
}

如果我像这样运行中间件,那就完美了:

const sagaMiddleware = createSagaMiddleware();
const store = createStore(
rootReducer,
applyMiddleware(sagaMiddleware)
);
sagaMiddleware.run(loginRequest);

但随后我添加了一个新的 rootSaga:

export default function* rootSaga() {
yield all([
fork(loginRequest),
fork(loginSuccess),
fork(loginFailure)
]);
}

我运行 rootSaga 而不是 loginRequest saga:

const sagaMiddleware = createSagaMiddleware();
const store = createStore(
rootReducer,
applyMiddleware(sagaMiddleware)
);
sagaMiddleware.run(rootSaga);

现在这些新代码根本不起作用。当我尝试在 loginRequest 生成器函数中使用 console.log(response); 时,表明 promise 已得到解决。并且它不会运行 then-catch。

谁能帮我解决这个问题吗?谢谢~

最佳答案

请尝试这个:

export function* loginRequest(data) {
yield takeLatest(LOGIN_REQUEST, data => {
const response = yield call(sendLoginRequest, data);

if (response.status >= 200 && response.status < 300) {
yield put(LOGIN_SUCCESS, data.data);
return;
}
yield put(LOGIN_FAILURE, err.response);
});
}

需要注意的是 sendLoginRequest 返回一个 promise 。 redux-saga 旨在使用 .then() 与 Promise 配合使用。您可以 yield call() 任何返回 Promise 的函数,并且 redux-saga 将等待 Promise 解析,然后再执行下一行代码。

关于javascript - Redux-saga 无法在 Promise 中使用生成器函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51722133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com