es6非同步解決方案

来源:https://www.cnblogs.com/LHLVS/archive/2020/02/11/12294201.html
-Advertisement-
Play Games

最初使用回調函數 ​ 由於最初j s官方沒有明確的規範,各種第三方庫中封裝的非同步函數中傳的回調函數中的參數沒有明確的規範, 沒有明確各個參數的意義, 不便於使用。 ​ 但是node中有明確的規範 ​ node中的的回調模式: 1. 所有回調函數必須有兩個參數,第一個參數表示錯誤,第二個參數表示結果 ...


最初使用回調函數

​ 由於最初j s官方沒有明確的規範,各種第三方庫中封裝的非同步函數中傳的回調函數中的參數沒有明確的規範, 沒有明確各個參數的意義, 不便於使用。

​ 但是node中有明確的規範

​ node中的的回調模式:

    1. 所有回調函數必須有兩個參數,第一個參數表示錯誤,第二個參數表示結果
    2. 所有回調函數必須作為函數最後的參數
    3. 所有回調函數不能作為屬性出現

es6 非同步處理模型

Es6 出現以後, 官方就提出了非同步處理的規範, 提出了一種適用於所有非同步場景的處理模型。該模型有:

兩個階段: 未決unsettled, 已決settled。

三個狀態: pending掛起狀態 , resolved成功, rejected失敗

總是從未決階段推向已決階段,且已決階段的狀態不再改變

任務已決狀態後可能需要後續處理,

針對resolved的後續處理我們稱之為thenable

針對rejected的後續處理我們稱之為catchable

為該非同步模型量身打造的API : promise

如何使用promise

const task = new Promise((resolve, reject) => {
    // 任務未決階段代碼
    // 立即執行
    console.log("開始100米長跑");
    setTimeout(() => {
       if (Math.random() > 0.5) {
           // 成功: 跑完了
           // 推向成功
           resolve("跑完了");
       } else {
           // 失敗: 腿摔斷了
           // 推向失敗
           reject("腿摔斷了");
       }
    }, 1000)
});
task.then((result) => {
  console.log(result);
}).catch((error) => {
  console.log(error);
})

1s 後任務推向已決, 後續處理在then 或者 catch中 處理。

註意

pending狀態 =》rejected狀態 :

1. 調用reject
2. 代碼執行報錯
3. 手動拋出錯誤

後續處理函數一定是非同步的,且會放到微隊列中,

j s執行棧清空後會先執行微隊列中的任務,微隊列里任務清空後才會執行巨集隊列中的任務。

巨集任務隊列有:setTimeout,setInterval,setImmediately,I/O,UI render

微任務隊列有:promise,process.nexttick,Object.observe(已經不用了),Mutation.observe

Async await 是es7新增的promise的語法糖大家也可以瞭解下,本文只是對promise做了個概述,

要掌握的其他細節還有很多


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 由於JavaScript 的 replace 只能替換一次,因此另外編寫一個能現替換全部匹配內容方法,代碼如下: /* 把 content 中所有的 searchValue 替換為 replaceValue */ function replaceAll(content,searchValue,rep ...
  • 不是 HTML 標簽。它為瀏覽器提供一項信息(聲明),即 HTML 是用什麼版本編寫的。 HTML是一門超文本標記語言,瀏覽器解析html標記後,展示頁面內容,目前流行HTML5,俗稱H5。靜態網頁的拓展名htm或html新建網頁的步驟:1、新建文本文檔,更改拓展名為htm或html2、編寫網頁的基... ...
  • 一、定寬高 1、絕對定位和負margin值: <section class="absolute"> <div></div> </section> <style> section{ display:block; } section.absolute { width: 100px; height: 10 ...
  • 最近正在學習node.js,就像搞一些東西來玩玩,於是這個簡單的爬蟲就誕生了。 ...
  • 先看let和var: 1. console.log(a); // undefined var a = 3; console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization let a = 3; 在 ...
  • 報錯信息: 1 Access to XMLHttpRequest at 'http://192.168.37.130:5050/socket.io/?EIO=3&transport=polling&t=N0oqNsW' from origin 'http://localhost:8080' has ...
  • 全局作用域和局部作用域 全局作用域 局部作用域:函數作用域 全局作用域在全局和局部都可以訪問到,局部作用域只能在局部被訪問到 var name="cyy"; function fn(){ var age=25; console.log(name);//cyy console.log(age);//2 ...
  • 什麼是網頁?html文檔經過瀏覽器內核渲染後展示出來的頁面(五大主流瀏覽器及四大內核) html文檔文件名尾碼是.html,之前存在的.htm是為支持DOM系統(目前織夢還是用.htm文件名結尾文件) 編碼是我們通過代碼的形式把想要展示的頁面寫到html文檔裡面,接著渲染作為一個動作,主要是ht... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...