Node.js Promise的詳細解析

一、Promise基礎介紹

在JavaScript中,Promise是一種用於非同步編程的技術,與回調函數相比,使用Promise編寫的代碼更加簡潔易懂,而且支持鏈式調用,更加符合代碼風格的美觀優雅。

Promise是一種代表了未來某個時間點完成的可能性的對象,可以用來處理非同步操作。Promise有三種狀態,分別是「等待態」(pending)、「完成態」(fulfilled)和「拒絕態」(rejected),一旦Promise狀態變為「完成態」或「拒絕態」,就不能再改變了。


//Promise的基本用法
const promise = new Promise((resolve, reject) => {
  //模擬非同步操作
  setTimeout(() => {
    const data = {name: 'tom', age: 20}
    resolve(data) //非同步操作成功時,調用resolve方法
    //reject('error') //非同步操作失敗時,調用reject方法
  }, 2000)
})
//使用Promise的then方法處理非同步完成情況
promise.then((data) => {
  console.log(data)
}).catch((error) => {
  console.log(error)
})

二、Promise的鏈式調用

除了能夠處理非同步操作,Promise還具備一種非常強大的功能——鏈式調用,也稱為Promise鏈。當需要對多個非同步操作進行處理時,就可以使用Promise鏈。

通過鏈式調用,Promise對象可以根據成功或失敗狀態返回的值進行後續操作,實際上是then方法返回了一個新的Promise對象,因此可以連續使用then方法。


//Promise鏈式調用
const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(2)
  }, 2000)
})
promise.then((res) => {
  console.log(res) //2
  return res * 2
}).then((res) => {
  console.log(res) //4
  return Promise.resolve(res * 2)
}).then((res) => {
  console.log(res) //8
}).catch((error) => {
  console.log(error)
})

三、Promise.all()

當有多個非同步操作需要執行,並且所有非同步操作都完成後需要執行某種操作時,可以使用Promise.all()方法,該方法接收一個Promise對象數組,當所有對象狀態都變為「完成態」時返回結果的數組,如果有一個對象狀態變為「拒絕態」,則會直接跳轉至catch()方法。

需要注意的是,Promise.all()方法返回的結果數組順序與輸入的Promise對象數組順序相同。


//Promise.all()用法
const promise1 = Promise.resolve('Hello')
const promise2 = 10
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 2000, 'Goodbye')
})
Promise.all([promise1, promise2, promise3]).then((values) => {
  console.log(values) //['Hello', 10, 'Goodbye']
}).catch((error) => {
  console.log(error)
})

四、Promise.race()

與Promise.all()類似,Promise.race()方法也是接收一個Promise對象數組,不同的是當任意一個Promise對象的狀態變為「完成態」或「拒絕態」時,返回結果並結束操作。

需要注意的是,Promise.race()方法返回的結果是第一個完成或拒絕的Promise對象的結果。


//Promise.race()用法
const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 2000, 'Goodbye')
})
const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 1000, 'Hello')
})
Promise.race([promise1, promise2]).then((value) => {
  console.log(value) //'Hello'
}).catch((error) => {
  console.log(error)
})

五、async/await與Promise

ES2017發布了async/await語法,這是一個新的非同步函數定型,可以讓非同步操作同步化,更加符合人們的正常思維方式。

async/await通過使函數返回一個Promise對象,讓代碼的執行順序與Promise進行結合,可以讓非同步操作更加簡單明了。


//async/await的基本用法
const fetchUserData = async (url) => {
  const response = await fetch(url) //等待非同步操作完成
  const data = await response.json() //等待非同步操作完成
  return data.name //返回結果
}
fetchUserData('https://api.github.com/users/octocat').then((data) => {
  console.log(data) //'The Octocat'
}).catch((error) => {
  console.log(error)
})

六、Promise的錯誤處理

當Promise對象狀態變為「拒絕態」時,需要進行錯誤處理,可以通過在鏈式調用中使用catch()方法來完成。

需要注意的是,如果任何一個非同步操作拋出錯誤或返回reject()方法,Promise對象會立即變為「拒絕態」狀態,直接跳轉至鏈式調用中的catch()方法,因此catch()方法需要放在鏈式調用的最後。


//Promise的錯誤處理
const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('error')
  }, 2000)
})
promise.then((res) => {
  console.log(res)
}).catch((error) => {
  console.log(error) //'error'
})

原創文章,作者:CMLAP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/361673.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CMLAP的頭像CMLAP
上一篇 2025-02-25 18:17
下一篇 2025-02-25 18:17

相關推薦

  • JS Proxy(array)用法介紹

    JS Proxy(array)可以說是ES6中非常重要的一個特性,它可以代理一個數組,監聽數據變化並進行攔截、處理。在實際開發中,使用Proxy(array)可以方便地實現數據的監…

    編程 2025-04-29
  • 解析js base64並轉成unit

    本文將從多個方面詳細介紹js中如何解析base64編碼並轉成unit格式。 一、base64編碼解析 在JavaScript中解析base64編碼可以使用atob()函數,它會將b…

    編程 2025-04-29
  • Node.js使用Body-Parser處理HTTP POST請求時,特殊字元無法返回的解決方法

    本文將解決Node.js使用Body-Parser處理HTTP POST請求時,特殊字元無法返回的問題。同時,給出一些相關示例代碼,以幫助讀者更好的理解並處理這個問題。 一、問題解…

    編程 2025-04-29
  • t3.js:一個全能的JavaScript動態文本替換工具

    t3.js是一個非常流行的JavaScript動態文本替換工具,它是一個輕量級庫,能夠很容易地實現文本內容的遞增、遞減、替換、切換以及其他各種操作。在本文中,我們將從多個方面探討t…

    編程 2025-04-28
  • JS圖片沿著SVG路徑移動實現方法

    本文將為大家詳細介紹如何使用JS實現圖片沿著SVG路徑移動的效果,包括路徑製作、路徑效果、以及實現代碼等內容。 一、路徑製作 路徑的製作,我們需要使用到SVG,SVG是可縮放矢量圖…

    編程 2025-04-27
  • 如何解決Node.js中jwt.sign()響應過慢的問題

    本文將從多個方面探討如何解決Node.js中jwt.sign()響應過慢的問題,給出完整的代碼示例與最佳實踐,幫助開發者更好地處理這個問題。 一、問題概述 在使用Node.js編寫…

    編程 2025-04-27
  • 如何使用JS調用Python腳本

    本文將詳細介紹通過JS調用Python腳本的方法,包括使用Node.js、Python shell、child_process等三種方法,以及在Web應用中的應用。 一、使用Nod…

    編程 2025-04-27
  • 如何反混淆美團slider.js

    本文將從多個方面詳細闡述如何反混淆美團slider.js。在開始之前,需要明確的是,混淆是一種保護JavaScript代碼的方法,其目的是使代碼難以理解和修改。因此,在進行反混淆操…

    編程 2025-04-27
  • Python要學JS嗎?

    Python和JavaScript都是非常受歡迎的編程語言。然而,你可能會問,既然我已經學了Python,是不是也需要學一下JS呢?在本文中,我們將圍繞這個問題進行討論,並從多個角…

    編程 2025-04-27
  • 解決js ajax post 419問題

    對於使用ajax post請求時出現的419問題,我們需要進行以下幾個方面的闡述,包括返回碼的含義、可能出現的情況、解決方案等內容。 一、解析419返回碼 419返回碼錶示用戶超時…

    編程 2025-04-27

發表回復

登錄後才能評論