<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ~~~ 1. JS中的同步異步編程 > 瀏覽器是多線程的,JS是單線程的(瀏覽器只分配一個線程來執行JS) > > 進程大線程小:一個進程中包含多個線程,例如在瀏覽器中打開一個HTML頁面就占用了一個進程,加載頁面的時候,瀏覽器分配一個線程去計算DOM樹,分配其它的線程去加載對應的資源文件...再分配一個線程去自上而下執行JS 同步:在一個線程上(主棧/主任務隊列)同一個時間只能做一件事情,當前事情完成才能進行下一個事情(先把一個任務進棧執行,執行完成,在把下一個任務進棧,上一個任務出棧...) 異步:在主棧中執行一個任務,但是發現這個任務是一個異步的操作,我們會把它移除主棧,放到等待任務隊列中(此時瀏覽器會分配其它線程監聽異步任務是否到達指定的執行時間),如果主棧執行完成,監聽者會把到達時間的異步任務重新放到主棧中執行... [宏任務:macro task] - 定時器 - 事件綁定 - ajax - 回調函數 - Node中fs可以進行異步的I/O操作 [微任務:micro task] - Promise(async/await) => Promise并不是完全的同步,當在Excutor中執行resolve或者reject的時候,此時是異步操作,會先執行then/catch等,當主棧完成后,才會再去調用resolve/reject把存放的方法執行 - process.nextTick 執行順序優先級:SYNC => MICRO => MACRO 所有JS中的異步編程僅僅是根據某些機制來管控任務的執行順序,不存在同時執行兩個任務這一說法 --------- 2. Promise A+ ~~~ ![](https://img.kancloud.cn/ac/b8/acb88b4c13008bce641bc48fe943dfb9_997x364.png) ![](https://img.kancloud.cn/e4/27/e42759501d6e2b14ef6c6303d1327166_1325x407.png) ![](https://img.kancloud.cn/1f/09/1f0996d55c5489a062bb5d984e567e50_1032x535.png) ~~~ setTimeout(() => { console.log(1); }, 20); setTimeout(() => { console.log(2); // while (true) { // }; }, 0);//=>默認會有最小的等待時間(V8一般是5~6MS) console.time('WHILE'); let i = 0; while (i <= 10) { i++; } console.timeEnd('WHILE'); setTimeout(() => { console.log(3); }, 10); console.log(4); // 4,2,1,3 ~~~ ~~~ //=>AJAX任務開始:SEND //=>AJAX任務結束:狀態為4 /* let xhr = new XMLHttpRequest(); xhr.open('GET', 'xxx.txt', false); /!*放到等待區的時候,此時狀態是1*!/ xhr.onreadystatechange = () => { console.log(xhr.readyState);//=>4 }; xhr.send(); /!*狀態為4的時候主棧空閑*!/*/ // let xhr = new XMLHttpRequest(); // xhr.open('GET', 'xxx.txt', false); // xhr.send(); // /*狀態已經為4了*/ // xhr.onreadystatechange = () => {//=>狀態改變才會觸發,放到等待區的時候狀態已經為4了,不會在改變了,所以不會執行這個方法(啥都不會輸出) // console.log(xhr.readyState); // }; // let xhr = new XMLHttpRequest(); // xhr.open('GET', 'xxx.txt'); // xhr.send();//=>異步操作:執行SEND后,有一個線程是去請求數據,主棧會空閑下來 // /*放等待區之前狀態是1*/ // xhr.onreadystatechange = () => { // console.log(xhr.readyState);//=> 2 3 4 // }; // /*主棧又空閑了*/ // //狀態為2 把函數執行 // //狀態為3 把函數執行 // //狀態為4 把函數執行 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看