javascript - 如何在 redux-saga 中等待 API 结果
问题描述
我有使用 React Saga 进行后端调用的 React-Typescript 应用程序。当我的一个来自前端的函数执行后端调用时,在它执行之前,来自前端的下一个函数开始执行。
我已经使用了 SETTIMEOUT 函数并且它有效!就是想知道有没有其他办法。
前端代码:
{ this.props.ValidateClient(validatorObject) }
this.finalvalid(clientIn)
反应传奇代码:
export function* ValidateClient(action) {
try {
console.log("1");
yield put(validateClientRequest());
console.log("2");
const data = yield call(() => {
return axios.get('https://localhost:44325/api/Clients/' + action.payload.firstName + "/" + action.payload.lastName + "/" + action.payload.Email);
}
);
console.log(data);
console.log("3");
yield put(validateClientSuccess(data.status));
console.log("4");
} catch (error) {
yield put(validateClientfailure(error));
}
在控制台中记录 1,2 后,第二个函数开始执行!
如何串行执行 React Saga 代码然后转到第二个函数?
解决方案
您的内联箭头函数不是异步的。你只是返回Promise
而不是await
ing 它。我不确定这是否绝对是一个问题(因为aync
函数本身Promise
也返回 a ),但我怀疑如果将异步逻辑外部化到一个单独的函数中,它会更好地工作call
。
import { call, put } from "redux-saga/effects";
import axios, { AxiosResponse } from "axios";
interface Payload {
firstName: string;
lastName: string;
Email: string; // is this really uppercase?
}
type YourResponseType = any; // fill this in
const callApi = async ({
firstName,
lastName,
Email
}: Payload): Promise<AxiosResponse<YourResponseType>> => {
return await axios.get<YourResponseType>(
"https://localhost:44325/api/Clients/" +
firstName +
"/" +
lastName +
"/" +
Email // don't you need to URL encode this??
);
};
export function* ValidateClient(action: { payload: Payload }) {
try {
console.log("1");
yield put(validateClientRequest());
console.log("2");
const data = yield call(callApi, action.payload);
console.log(data);
console.log("3");
yield put(validateClientSuccess(data.status));
console.log("4");
} catch (error) {
yield put(validateClientfailure(error));
}
}
尝试这个。我不能保证它是正确的,因为您的示例不能完全重现。
推荐阅读
- c# - 不在单引号内时匹配的正则表达式
- javascript - 将数组的每个元素写入文件的新行的最佳方法是什么?
- javascript - 使用 socket.io、react.js 和 node.js 进行实时通知
- mysql-workbench - 从 MySQL Workbench 恢复或访问工作区
- java - 使用 Docker 桥接网络时无法在集成测试中获取 JDBC 连接
- scala - 从 sbt 文档实现命令更改
- amazon-web-services - aws-sdk,如何将 JSONArray 发送到 DynamoDB updateItem() 方法?
- kubernetes - 执行非滚动 Kubernetes 更新
- c# - 如何使用没有列名的 linq 连接两个数据表
- javascript - 按该字典中的枚举值对字典的角度排序数组