javascript - 如何处理 setState 中的承诺?
问题描述
我有以下反应代码,代表文本输入。
onChangeDestination(url, index) {
this.setState(prevState => {
const rules = [...prevState.rules];
rules[index] = { ...rules[index], url};
if (isURL(url+'')) {
testURL(url).then(r=> {
var url_status = r.data.response
rules[index] = { ...rules[index], url_status};
})
} else {
var url_status = "No URL"
rules[index] = { ...rules[index], url_status};
}
return { rules };
});
};
用英语讲:
如果 URL 通过isURL()
验证,则使用自定义函数testURL()
查看该 URL 的 HTTP 状态(使用axios
)。
在我的模板中,相关位有一个 {props.url_status} 。
问题是,即使它正在将所需的行为记录到控制台,它似乎并没有可靠地更新视口,我认为这与承诺有关。
我究竟做错了什么?
解决方案
您可以通过将函数转换为异步并在setState
. 此解决方案使用更易于阅读的async/await
语法和三元条件来选择正确的状态值:
const url_status = isURL(url + '') ? (await testURL(url)).data.response : "No URL"
此行将执行您的承诺并仅在isURL
return时等待它true
,如果是,它将返回响应部分,如果不是,它将发送出去"No URL"
。
完整代码:
async onChangeDestination(url, index) {
const url_status = isURL(url + '') ? (await testURL(url)).data.response : "No URL"
this.setState(prevState => {
const rules = [...prevState.rules];
rules[index] = {
...rules[index],
url,
url_status
};
return { rules };
});
};
推荐阅读
- java - InnoSetup 编译器设置文件不创建数据库文件
- python - python - 具有不同键的 Json 数据
- python - 如何让凯撒密码在保留案例的同时忽略空格和标点符号?
- angular - 我如何更改默认文本“按 Enter 键添加”标签输入表单中的角度?
- join - SAS多对多合并
- python - 无法使用 DearPyGui 为绘制的图形添加单击处理程序
- javascript - 将状态/数据传递给功能组件,我做错了/更容易吗?
- firebase - 连接到 firebaseio.com 需要什么证书?
- r - 使用数据集在 R 中创建直方图
- python - 在 RTX 3070 问题上使用 Tensorflow 1.5.0 训练 ResNet50