複習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
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...