複習promise---node

来源:https://www.cnblogs.com/ygjzs/archive/2020/01/25/12233204.html
-Advertisement-
Play Games

promise這個東西,我都不知道見過多少回了!,非常重要,這裡在回憶一遍 發現問題 使用promise 封裝promise html頁面中promise 處理錯誤 最後 這種事把錯誤放在最後處理 當然,也可以在中間處理錯誤 不過一般都在最後處理 promise resolve不支持多參數 ...


promise這個東西,我都不知道見過多少回了!,非常重要,這裡在回憶一遍

發現問題

const fs = require('fs')

fs.readFile('./data/1.txt', (err, data) => {
  console.log(111)
  fs.readFile('./data/2.txt', (err, data) => {
    console.log(222)
    fs.readFile('./data/3.txt', (err, data) => {
      console.log(333)
    })
  })
})

// Promise

使用promise

/**
 * Promise 在 Ecmascript 6 中體現出來就是一個對象
 * Promise 是一個容器
 * 一般用來封裝一個非同步操作
 *   非同步操作是一個無法預測的事情,要嗎成功,要嗎失敗
 * 容器內部有三種狀態:
 *     pending  正在處理
 *     resolved 成功,已解決
 *     rejected 駁回,失敗
 */

const fs = require('fs')

// Promise 對象一經創建,立即執行
new Promise((resolve, reject) => {
  fs.readFile('./data/2.txt', (err, data) => {
    if (err) {
      // 當 Promise 對象內部的非同步操作結果失敗的時候,告訴 Promise 對象容器,該非同步任務失敗了
      // 其實就是將 Promise 內部的 Pending 狀態改為 Rejected
      reject(err)
    }
    // 當代碼執行到這裡,說明該 Promise 對象內部的非同步操作沒有錯誤發生,證明成功了
    // 然後在這裡將 Promise 內部的 Pending 狀態改為 Resolved
    resolve(data)
  })
})
// Promise 實例對象有一個方法:then 方法
// then 需要傳遞兩個回調處理函數
// 其中第一個回調處理函數就是 Promise 對象內部的  resolve 函數
// 第二個回調處理函數是可選的,如果傳遞則就是 Promise 對象內部的 reject 函數
.then((data) => {
  console.log(111)
  console.log(data.toString())
  return new Promise((resolve, reject) => {
    fs.readFile('./data/3.txt', (err, data) => {
      if (err) {
        // 這裡沒有使用 return 的原因就是 Promise 的狀態只能從 Pending 變為 Resolve 或者 Rejected
        // 狀態一旦改變,就不會再發生變化
        reject(err)
      }
      resolve(data)
    })
  })
}, (err) => {
  console.log('讀取文件失敗了')
})
// then 方法之後可以繼續鏈式調用 then
// 後續的每一個 then 中指定的回調處理函數都會被執行
// 後續的 then 中指定的回調處理函數可以接收上一個 then 中指定的成功的回調處理函數的返回結果
//    1. 沒有返回值,預設就是 undefined
//    2. 有普通的返回值,數字、字元串、對象、數組。。。
//    3. 返回一個新的 Promise 對象
.then((data) => {
  console.log(222)
  console.log(data.toString())
  return new Promise((resolve, reject) => {
    fs.readFile('./data/1.txt', (err, data) => {
      if (err) {
        // 這裡沒有使用 return 的原因就是 Promise 的狀態只能從 Pending 變為 Resolve 或者 Rejected
        // 狀態一旦改變,就不會再發生變化
        reject(err)
      }
      resolve(data)
    })
  })
})
.then((data) => {
  console.log(333)
  // 二進位數據調用 toString() 方法可以轉換為普通的字元,預設就是 utf8 編碼
  console.log(data.toString())
})

封裝promise

const fs = require('fs')

readFile('./data/1.txt', 'utf8')
  .then(data => {
    console.log(data)
    return readFile('./data/2.txt', 'utf8')
  })
  .then(data => {
    console.log(data)
    return readFile('./data/3.txt', 'utf8')
  })
  .then(data => {
    console.log(data)
  })

function readFile(...args) {
  return new Promise((resolve, reject) => {
    fs.readFile(...args, (err, data) => {
      if (err) {
        reject(err)
      }
      resolve(data)
    })
  })
}

html頁面中promise

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>XMLHttpRequest - Promise</title>
</head>
<body>
  <div>
    姓名:
    年齡:
  </div>
  <script>

    function xhr(options) {
      return new Promise(function (resolve, reject) {
        var xhr = new XMLHttpRequest()
        xhr.open(options.type || 'get', options.url)
        xhr.onreadystatechange = function () {
          if (xhr.readyState === 4 && xhr.status === 200) {
            resolve(xhr.responseText)
          } else {
            reject()
          }
        }
        xhr.send()
      })
    }

    xhr({
      url: '',
      type: '',
      data: ''
    })
    .then(data => {
      return xhr({
        
      })
    })
    .then(data => {
      // 做渲染處理
    })

    $.ajax({

    }).then(data => {
      return $.ajax({

      })
    })
    .then(data => {
      
    })
  </script>
</body>
</html>

處理錯誤--最後

這種事把錯誤放在最後處理
當然,也可以在中間處理錯誤
不過一般都在最後處理

const fs = require('fs')

readFile('./data/4.txt', 'utf8')
  .then(data => {
    console.log(data)
    return readFile('./data/2.txt', 'utf8')
  })
  .then(data => {
    console.log(data)
    JSON.parse('{dsadsa')
    return readFile('./data/3.txt', 'utf8')
  })
  .then(data => {
    console.log(data)
  })
  // 在使用 Promise 做非同步流程式控制制的時候,關於異常的處理可以通過在最後一個 then 之後設置一個 catch
  // 然後指定一個失敗處理函數
  // 該函數可以捕獲前面所有的 Promise 對象本身以及 then 內部的任務錯誤
  // 當前面任何一個發生異常,直接進入 catch,後續所有的 Promise 包括 then 不再執行
  .catch(err => {
    console.log(err)
  })

function readFile(...args) {
  return new Promise((resolve, reject) => {
    fs.readFile(...args, (err, data) => {
      if (err) {
        reject(err)
      }
      resolve(data)
    })
  })
}

promise-resolve不支持多參數


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

-Advertisement-
Play Games
更多相關文章
  • .NET基金會是一個獨立的非營利組織,於2014年成立,旨在圍繞 .NET 不斷增長的開源技術集合,促進開放開發和協作。它是商業和社區開發人員的論壇,通過促進開放性,社區參與和快速創新來增強.NET生態系統的未來。要使.NET 基金會真正獨立並由社區運營,則需要獨立資助。過去,.NET 基金會依靠來... ...
  • 【五分鐘的dotnet】是一個利用您的碎片化時間來學習和豐富.net知識的博文系列。如果您現在正在使用.NetCore的話,相信您對await 和 async這兩個關鍵字再熟悉不過了。它們是為非同步編程提供的語法糖,便於我們在代碼中更便捷的進行非同步操作。await 和 async其實是對Task對象都... ...
  • 之前一直知道使用 Ctrl+Z 掛起前臺進程來阻止進程運行,之後可以再通過 shell 的作業控制 (jobs / fg N) 來將後臺進程切換為前臺,從而繼續運行。 最近學到一種新的方法,對於不停有 console 輸出的前臺進程,可以使用 Ctrl+S 來 STOP 一個進程的輸出,從而暫停進程 ...
  • 一、RPM版安裝 查看是否有其他版本的資料庫,若有,刪除乾凈 非root用戶必須要有sudo許可權 1.下載mysql相關安裝包 https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql80-community-el7/mysql-community-s ...
  • CentOS7上安裝mysql後,想要實現mysql遠程登錄。主要解決二個問題:(1)為mysql用戶授予遠程登錄許可權(改表法或授權法);(2)防火牆開放3306埠。(一)授予登錄許可權mysql -u root -p 輸入密碼進入到mysql中。授權法創建賬號test並授權,密碼為password... ...
  • redis中動態字元串sds相關的文件為:adlist.h與adlist.c 一、數據結構 redis里定義的雙向鏈表,與普通雙向鏈表大致相同 單個節點: 1 typedef struct listNode { 2 struct listNode *prev; 3 struct listNode * ...
  • 舊版貓眼電影底部有4個標簽導航:電影、影院、發現、我的,如下圖所示: 一、首先,打開微信開發者工具,新建一個項目:movie。如下圖: 二、建立如下的一些目錄: 三、將底部標簽導航圖標的素材放到images的bar中(0表示標簽未被選中,1表示選中),如圖: 四、打開app.json配置文件,在pa ...
  • 一段學習的結束 我也不知道我這是在寫些什麼,只是覺得學完了一些東西,就是想把它記錄 一下,這樣我就可以知道我是學過這一塊的,要多激勵自己,^_^O(∩_∩)O哈哈~ 以下內容並不完全與標題匹配,不過以下內容綜合了前面幾篇的應用,並增加了 部分東西 js帶碼要和html代碼一起看 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...