js異步之間執行的順序


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

 

哈哈

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM