javascript - react 中各个声明周期中异步的执行顺序
问题描述
componentWillMount(){ setTimeout(()=>{ alert(1); },100) } componentDidMount(){ setTimeout(()=>{ alert(2); },100) }
组件中的2个生命周期函数都有异步操作,执行顺序是严格按照声明周期的顺序,也就是先1后2,还是不确定执行顺序是根据插入到消息队列里面的先后顺序执行的?问题可以理解为假设componentWillMount这个异步结果返回时间很长很长,而componentDidMount这个异步结果返回时间很短,有没有可能先执行componentDidMount里面的回调结果,然后在执行componentWillMount里面的回调结果
问题解答
回答1:简化问题为:假设两个异步动作 A 和 B 触发顺序已知,那么 A 和 B 中同样延时的 setTimeout 是否能保证顺序?
答案显然是不能的。例如当 A 和 B 之间只有微秒级延时时,两个设定了巨大延时的 setTimeout 就不能保证按照调用 setTimeout 时的先后顺序触发。
不能够依赖这种脆弱的时序关系来保证代码的执行顺序。在 Code Review 中如果遇到利用这种关系来实现数据初始化、异步请求等功能的代码,答主肯定是会提出意见的。对于异步的控制流,可以采用 Promise / yield 等方式来保证执行顺序,在这里就不赘述了。
相关文章:
1. javascript - 如何判断用户切换到了当前标签页?2. javascript - 为什么!function foo(){}返回false,!function foo(){}()返回true?3. javascript - 使用ionic建立start一个项目的时候,总是失败。4. mysql中 when then 的优化5. javascript - 在nodejs的程序里面怎么理解IO呢,如何用一段代码来说明IO6. mysql主从 - 请教下mysql 主动-被动模式的双主配置 和 主从配置在应用上有什么区别?7. javascript - 在一些视频为主的h5页面中,是怎么做到获取视频缓冲进度或者说如何对video视频做预加载的8. datetime - Python如何获取当前时间9. 关于java 泛型设计接口 导致的参数类型不匹配问题10. 数据库 - mysql中怎样修改带点的字段名的位置?

网公网安备