javascript - 在反应中,在等待/异步完成之前运行函数序列的最佳方法是什么?- 使用执行时间
问题描述
目标: 我希望能够在 await 等待完成时显示几行 html 行。例如..
<p>starting api</p>
<p>loading</p>
<p>getting api</p>
我只是希望这些延迟加载(也许我可以使用超时功能),但总而言之,如果等待完成,这些 p 标签就会消失并且用户看到的只是
完毕!
问题: 我不需要知道如何实现超时功能或如何在反应中进行条件渲染。我想知道的是如何使用“等待”时间 - 等待完成所需的时间(通常是几秒钟)并在页面上显示某些文本以模仿进度?
当前解决方案
请忽略我的 catch 错误块,因为我没有在其中实现 setTimeout。但基本上在这里,即使 api 调用在 2 秒内完成,我也会延迟用户看到的内容。这是一种解决方法,这更适用于 ux。但我想知道是否可以利用执行时间并显示 msges。
handleSubmit = async event => {
event.preventDefault();
setTimeout(()=> {
this.setState(prevState => ({
status: {
...prevState.status,
start: true
}
}));
}, 1000);
setTimeout(()=> {
this.setState(prevState => ({
status: {
...prevState.status,
api: true
}
}));
}, 2000);
try {
let data = await this.getlogin();
setTimeout(()=>{
this.setState(prevState => ({
status: {
...prevState.status,
start: true,
api: true
},
done: {
...prevState.done,
done: true
}
}));
}, 3000);
} catch (e) {
alert(e);
this.setState(prevState => ({
status: {
...prevState.status,
start: true,
api: true
},
done: {
...prevState.done,
done: false
}
}));
}
};
enter code here
解决方案
没有工作片段很难给出准确的解决方案,但这里有一个条件渲染的例子:
class App extends React.Component {
state = {
startingApi: false,
loadingApi: false,
gettingApi: false
}
handleClick = () => {
this.setState({startingApi: true, loadingApi: true, gettingApi: true});
setTimeout(() => {
this.setState({startingApi: false});
}, 1000);
setTimeout(() => {
this.setState({loadingApi: false});
}, 2000);
setTimeout(() => {
this.setState({gettingApi: false});
}, 3000);
}
render(){
return (
<div>
<button onClick={this.handleClick}>Get Data</button>
<div>
{this.state.startingApi
? <React.Fragment>
<img src="https://thumbs.gfycat.com/ZealousCloudyAntelopegroundsquirrel-small.gif" />
Starting API
</React.Fragment>
: "Api started"
}
</div>
<div>
{this.state.loadingApi
? <React.Fragment>
<img src="https://thumbs.gfycat.com/ZealousCloudyAntelopegroundsquirrel-small.gif" />
Loading API
</React.Fragment>
: "Api Loaded"
}
</div>
<div>
{this.state.gettingApi
? <React.Fragment>
<img src="https://thumbs.gfycat.com/ZealousCloudyAntelopegroundsquirrel-small.gif" />
Getting API
</React.Fragment>
: "Api Gotten"
}
</div>
</div>
);
}
}
ReactDOM.render(<App />, document.querySelector('#root'));
img {
width: 20px;
margin-left: 10px;
}
div {
padding: 10px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
推荐阅读
- python - 可以限制 skopt.Lhs.generate 的结果吗?
- c# - 移动文件 C# 总是抛出异常
- python - 我将如何发出命令并且有人使用它来检测他们是否将受限制的单词放入它运行的受限制单词列表中'print(“Language”)'?
- django - Django Rest 框架中的基于会话的与令牌身份验证
- excel - 是否有一个 Excel 公式可以在组内提供第 n 次出现
- python - 在线性数组openCV python livestream中查找特定像素
- kubernetes - 使用接入点时 EFS-CSI 无法挂载路径
- racket - 在球拍中使用三个参数实现reduce过程:函数、基数和列表
- server-side-rendering - svelte svelte-adapter-firebase 功能设置
- flutter - 尝试从文档中读取字段时,Future 返回 null