今天同事問了一個問題,怎么讓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是老大中的老大,更先執行,因為它設計的原理是要隔離作用域,不需要等待任何異步即可執行。
哈哈
