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 - angular使從elastichearch中取出的文本高亮顯示,如圖所示2. python bottle跑起來以后,定時執行的任務為什么每次都重復(多)執行一次?3. javascript - 求幫助 , ATOM不顯示界面!!!!4. 視頻文件不能播放,怎么辦?5. javascript - vue2如何獲取v-model變量名6. python - 爬蟲模擬登錄后,爬取csdn后臺文章列表遇到的問題7. mysql - 分庫分表、分區、讀寫分離 這些都是用在什么場景下 ,會帶來哪些效率或者其他方面的好處8. javascript - 為什么在谷歌控制臺 輸出1的時候,輸出的1立馬就不見了9. html5 - HTML代碼中的文字亂碼是怎么回事?10. javascript - ios返回不執行js怎么解決?
