今天同事問了一個問題,怎么讓ajax中的回調(保持異步)先執行,再讓普通的function執行。。。
整了個解決辦法:
如下:
<!DOCTYPE html> <html> <head> <title>lhy1</title> </head> <body> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script> <script type="text/javascript"> debugger; (function(){ // 建個ajax $.ajax({ type:'POST', contentType:"application/json", url:"https://api.douban.com/v2/movie/top250?start=0&count=10", success: (result) => { console.log(result); console.log("RRRRRRRRRRRRRRRRRRRrr") }, error: (err) => { console.log(err) } }) })(); setTimeout(() => {console.log("HHHHHH")},1) </script> </body> </html>
將同步代碼放入setTimeout中,變成異步,則和ajax中的回調同為異步,則按照異步的方式來排列執行順序。
由此引入異步之間的執行順序問題!
首先常見的異步一般有:ajax可以異步也可同步、回調、setTimeout系列、事件綁定。 而es6中的新增的promise、async/await。
按照js的執行順序,先執行同步,再執行異步。那么上面這些異步的執行之內該如何執行呢?
首先了解一下宏任務和微任務。
在js執行機制中,除了同步任務和異步任務,還有宏任務和微任務。
- 宏任務:整體代碼script、setTimeout、setInterval。
- 微任務:Promise、Promise.nextTick、回調
在js執行的時候,會先執行同步,異步被放入異步隊列中,而不同的異步任務會被放入不同的異步隊列中。
每次js執行,先從整體scripts也就是一個宏任務進入,執行完里面所有的微任務以后(也就是同步任務被執行完),再去異步的任務隊列中,找到下一個宏任務,執行里面的所有微任務,如果沒有宏任務了,則執行任務隊列中的所有微任務。
所以異步的執行順序是按照誰是宏任務,誰是微任務來執行的。
則定時器是異步中的老大,先執行。而IIFE是老大中的老大,更先執行,因為它設計的原理是要隔離作用域,不需要等待任何異步即可執行。
哈哈