javascript - JS中同步调用函数
问题描述
我想在函数执行后在 React 中调用 API。
const [isVisible, setVisible] = useState(false);
const [isValid, setValidation] = useState(true);
const [validationMessage, setValidationMessage] = useState('');
const validate = (callback) => {
if (code == null || code.trim().length === 0) {
setValidation(false);
setValidationMessage(translate.signIn.codeErrorMessage);
setVisible(true);
} else if (phoneNumber == null || phoneNumber.trim().length === 0) {
setValidation(false);
setValidationMessage(translate.signIn.phoneErrorMessage);
setVisible(true);
}
callback();
}
const authenticate = async () => {
try {
return await (authenticateUser.get('/abc', {
params: {
code,
phoneNumber,
}
}));
}
catch (e) {
setValidationMessage(translate.signIn.exceptionMessage);
setVisible(true);
}
}
const validateUserCredentials = () => {
if (isValid) {
setActivitySpinner(true);
authenticate().then(response => {
setActivitySpinner(false);
const responseData = response.data;
console.log('responseData', responseData);
if(responseData.status !== 200) {
setVisible(true);
setValidationMessage(responseData.message);
}
else if(responseData.status === 200) {
console.log('success');
}
});
}
}
const onSubmit = () => {
validate(validateUserCredentials);
}
当我调用“onSubmit”函数时,即使isValid的值为 false。我可以看到正在调用 API。我只想在函数validate完成其任务后调用函数validateUserCredentials 。
谁能告诉我我在这里做错了什么?
解决方案
Ciao,肯定validateUserCredentials
是在 之后调用validate
的,也许你很困惑,因为即使你设置为 false ,validateUserCredentials
你也看到它仍然是 true。isValid
不幸的是,使用 Hooks,您不能将回调作为 this.setState 来确定isValid
已设置的确定性。你可以做的是:
const validate = (callback) => {
let isvalid_temp = isValid;
if (code == null || code.trim().length === 0) {
setValidation(false);
isvalid_temp = false;
setValidationMessage(translate.signIn.codeErrorMessage);
setVisible(true);
} else if (phoneNumber == null || phoneNumber.trim().length === 0) {
setValidation(false);
isvalid_temp = false;
setValidationMessage(translate.signIn.phoneErrorMessage);
setVisible(true);
}
callback(isvalid_temp);
}
const validateUserCredentials = (isvalid_temp) => {
if (isvalid_temp) {
setActivitySpinner(true);
authenticate().then(response => {
setActivitySpinner(false);
const responseData = response.data;
console.log('responseData', responseData);
if(responseData.status !== 200) {
setVisible(true);
setValidationMessage(responseData.message);
}
else if(responseData.status === 200) {
console.log('success');
}
});
}
}
推荐阅读
- kotlin - Kotlin 编译器错误:类型不匹配。必需:CapturedType(out A) 找到:A
- java - 在数据库表的动态分区上休眠
- r - 这是来自更大函数的一段代码,但我不明白这部分是做什么的,谁能解释一下?
- ios - UIScrollView 缩放 uiview 到方面填充
- c# - C# 和 Python 应用程序之间交互的替代方案——Pythonnet vs DLL vs 共享内存 vs 消息传递
- c# - 循环发送到多个电子邮件地址时,附件流变为 0 字节
- c++ - 如何将我的 C++ 代码与 Visual Studio C++ 中的表单连接起来?
- ios - 无法使用 Xcode 成功签署 Mac Catalyst 应用程序
- google-sheets - 如何在Google表格中将字符串拆分到分隔符的左侧和右侧
- sas - 输入语句中日期变量名前面@6和@15的含义