前端非同步編程之Promise和async的用法

来源:https://www.cnblogs.com/windrainpy/archive/2019/02/27/10444708.html
-Advertisement-
Play Games

傳統的非同步解決方案採用回調函數和事件監聽的方式,而這裡主要記錄兩種非同步編程的新方案: ES6的新語法Promise ES2017引入的async函數 Generator函數(略) Promise的含義 是非同步變成的一種解決方案,屬於ES6的語法。 簡單的說,promise就是一個容器,裡面包含著一個 ...


傳統的非同步解決方案採用回調函數和事件監聽的方式,而這裡主要記錄兩種非同步編程的新方案:
  1. ES6的新語法Promise
  2. ES2017引入的async函數
  3. Generator函數(略)

Promise的含義


是非同步變成的一種解決方案,屬於ES6的語法。
簡單的說,promise就是一個容器,裡面包含著一個未來才會結束的事件(通常是一個非同步操作)的結果。
比起傳統的非同步解決方案(回調函數和事件),promise更合理更強大,把非同步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。


Promise的基本用法

ES6規定,Promise是一個構造函數,接受一個函數作為參數,該函數有兩個參數分別是resolve和reject:
/**
 * resolve 非同步操作成功時調用的方法,並將非同步操作的結果作為參數傳遞出去
 * reject 非同步操作失敗時調用的方法,並將報錯傳遞出去
 */
var promise = new Promise(function(resolve, reject) {
    var isSuccess = true // 非同步操作是否成功
    if (isSuccess) {
        resolve(data)
    } else {
        reject(error)
    }
})

 

Promise實例生成以後,可以用then方法,傳入兩個函數,分別指定resolve狀態和reject狀態的回調函數(第二個函數可選):
promise.then(function() {
    // 非同步操作成功的處理,resolve狀態
}, function() {
    // 非同步操作失敗的處理,reject狀態
})

 

一個Promise對象的簡單例子:
var timeout = function(ms) {
    var data = {
        list: Array(0),
        msg: 'success',
        status: 200
    }
    return new Promise(function(resolve, reject) {
        setTimeout(resolve, ms, data)
    })
}
timeout(1000).then(function(data) {
    console.log(data)
}, function(error) {
    console.log(error)
})

 

非同步載入圖片的例子:
function loadImageAsync(src) {
    return new Promise(function(resolve, reject) {
        var image = new Image()
        image.src = src

        image.onload = function() {
            resolve(image)
        }

        image.onerror = function() {
            reject(new Error(`載入圖片失敗,url:${url}`))
        }
    })
}

var url = 'http://n.sinaimg.cn/ent/transform/250/w160h90/20190226/jjhJ-htptaqe5318645.jpg'
loadImageAsync(url).then((image) => {
    document.body.append(image)
}, (err) => {
    console.log(err)
})

 

 

 

async函數

在普通函數前面加 async,就意味著函數內包含了非同步操作。async函數返回一個Promise對象,可以使用then方法添加回調函數。 在執行的時候,一旦遇到 await 命令就會先返回,等到非同步操作完畢,在接著執行函數體內後面的語句。
簡單的例子,指定多少毫秒後輸出一個值:
function timeout(ms) {
    return new Promise(function(resolve, reject) {
        setTimeout(() => {
            resolve()
        }, ms)
    })
}

async function asyncPrint(ms) {
    await timeout(ms)
    console.log(`過去了${ms}毫秒,輸出此語句`)
}

asyncPrint(1000)
    語法註意點:   1. async 函數返回 一個Promise 對象。async 函數內部return語句返回的值,會成為then回調函數的參數。
async function f() {
    return 'hello'
}
f().then((data)
=> { console.log(data) // ‘hello’ })

 

2. async函數內部拋出錯誤,會導致返回的 Promise 對象編程reject狀態,拋出的錯誤對象會被catch回調函數接收到。
async function f() {
    throw new Error('出錯了')
}

f().then((data) => {
    console.log('resolve data:', data)
}).catch((err) => {
    console.log('reject error:', err)
})
或者簡寫成
f().then(
    data => console.log(data),
    err => console.log(err)
)

 

3. 防止出錯的方法,也是將其放在try...catch代碼塊之中。
async function main() {
    try {
        const val1 = await firstStep();
        const val2 = await secondStep(val1);
        const val3 = await thirdStep(val1, val2);
    
        console.log('Final: ', val3);
    }
    catch (err) {
        console.error(err);
    }
}

 


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

-Advertisement-
Play Games
更多相關文章
  • HTML5 1、html5是什麼 萬維網的核心語言、標準通用標記語言下的一個應用超文本標記語言(HTML)的第五次重大修改。 h5並不是一門新的語言,而是html語言的第五次修訂。 2.html5支持的瀏覽器版本 基本上所有的主流瀏覽器都支持(Chrome,Firefox,Safari 等) IE9 ...
  • 今天看了react源碼,僅以記錄。 1:monorepo (react 的代碼管理方式) 與multirepo 相對。 monorepo是單代碼倉庫, 是把所有相關項目都集中在一個代碼倉庫中,每個module獨立發佈,每個module都有自己的依賴項(package.json),能夠作為獨立的npm ...
  • <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <script> var count=0; //初始化變數 function guess(){ //自定義一個函數 for(s= pa ...
  • 效果: 引用CSS、JS: Vue、element-ui、Axios treeTable: https://github.com/ProsperLee/element-tree-grid 模擬根據父id請求子數據的JSON: HTML部分: JS部分:// 註意屬性表格要顯示展開箭頭需要加入 chi ...
  • 有些時候,我們在開發過程中需要判斷,當前頁面被打開是否是處於源生的webview裡面,或者NODEJS做伺服器後端支持的時候,判斷請求來源是否來至於源生webview裡面被打開的頁面請求GET/POST/.. 於是寫了一個輪子,用javascript的形式判斷當前設備android或者ios,是不是 ...
  • 一,主流瀏覽器及內核 Chrome Webkit/blink IE Trident Firfox Gecko Safari Webkit Opera presto 二,css權重 !importent Infinity(正無窮) 行間樣式 1000 id 100 class/屬性/偽類 10 標簽/ ...
  • 由於最近工作中遇到需要在電腦上調試手機端的功能和樣式,之前也沒有遇到過,所以就各種百度和試驗。最後終於功夫不負有心人,成功了。(那一刻心情真滴很雞凍啊~~~~~~~~~)。所以暫時記錄下來。以免雞凍過度再給忘記了。 好,接下來就是具體的步驟啦。由於沒有什麼筆墨經驗,所以都是大白話啦。
  • 使用CSS3實現三角形: 在前端頁面中有很多時候會遇到需要三角形圖案的時候,以前不知道可以用CSS3實現三角形的時候,一般都是叫UI把三角形圖案切出來。 後來知道原來可以用CSS3實現三角形,可是用過一次後很容易忘記,所以想把這個小技巧記錄起來~ CSS3是如何實現三角形的呢?——答案是通過邊框,也 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...