Promise – 從初識到深入理解

一、primitive

在了解Promise之前,我們先來看一下primitive的概念。Primitive指的是JavaScript中的基本數據類型,包括了number、string、boolean、null、undefined和symbol等6種。當我們在JavaScript中定義一個變量並賦值時,賦給它的值是Primitive類型中的一種。

比如:

let a = 10 // a是number類型的變量
let b = 'hello world' // b是string類型的變量
let c = true // c是boolean類型的變量

Primitive類型的變量存儲的是值本身,而不是一個指向內存地址的指針。

二、premise

Promise(承諾)是異步編程中的一個重要概念。我們通常使用異步函數來處理一些比較耗時的操作,比如請求API接口、文件讀寫等。在異步操作中,我們不能像同步操作一樣等待操作完成再執行,而是需要使用回調函數來處理異步操作結果。

而Promise則是一種更加優雅的異步編程方式。它可以用一個對象來表示一個異步操作的最終完成(或失敗)狀態及其返回值。這個對象可以被異步函數返回,同時可以被其他函數通過then()方法處理異步結果。

Promise有三種狀態:

  • pending: 初始狀態,既不是成功,也不是失敗狀態。
  • fulfilled: 意味着操作成功完成。
  • rejected: 意味着操作失敗。

一個Promise對象的狀態只能由pending轉變為fulfilled或rejected。狀態一旦改變,就不能再變。

下面是一個簡單的例子:

const p = new Promise((resolve, reject) => {
  // 異步操作
  setTimeout(() => {
    if (Math.random() > 0.5) {
      resolve('操作成功')
    } else {
      reject('操作失敗')
    }
  }, 1000)
})

p.then(
  res => { console.log(res) }, // 成功處理函數
  err => { console.error(err) } // 失敗處理函數
)

三、promising

Promise的一個重要特點就是可以鏈式調用。在鏈式調用中,每一個then()方法都會返回一個新的Promise對象,從而實現對異步操作結果的串行處理。

下面是一個簡單的例子,演示了鏈式調用的過程:

fetch('/api/data')
  .then(response => response.json())
  .then(data => {
    // 對返回的數據進行處理
  })
  .catch(error => {
    console.error(error)
  })

在上面的例子中,fetch()方法返回的是一個Promise對象,然後通過then()方法鏈式調用,對獲取的數據進行解析和處理。如果發生錯誤,則通過catch()方法進行錯誤處理。

四、premises

Promise還有一個重要的特點,就是可以將多個Promise對象組合成新的Promise對象。這個特點有時候也叫做Promise的合成(Composition)特性。

一個常見的應用場景就是同時請求多個API接口。我們可以使用Promise.all()方法將多個Promise對象合成一個新的Promise對象,等待所有異步操作都完成,再統一處理結果。

下面是一個簡單的例子:

const p1 = fetch('/api/data1')
const p2 = fetch('/api/data2')
const p3 = fetch('/api/data3')

Promise.all([p1, p2, p3])
  .then(responses => Promise.all(responses.map(response => response.json())))
  .then(data => {
    // 對多個API接口的數據進行處理
  })
  .catch(error => {
    console.error(error)
  })

五、promises

除了Promise.all()方法之外,Promise還提供了其他一些方法來實現異步操作的控制。

一個常用的方法就是Promise.race(),它可以同時執行多個異步操作,只響應最先完成的操作。這個方法適用於一些對速度要求比較高的場景。

下面是一個簡單的例子:

const p1 = new Promise(resolve => setTimeout(resolve('p1'), 1000))
const p2 = new Promise(resolve => setTimeout(resolve('p2'), 2000))
const p3 = new Promise(resolve => setTimeout(resolve('p3'), 3000))

Promise.race([p1, p2, p3])
  .then(res => console.log(res))
  .catch(error => console.error(error))

六、promise的用法

Promise是非常常見的異步編程方式,幾乎每個JavaScript開發者都會使用它。下面是一些Promise的常用用法。

  • 使用new Promise()創建一個新的Promise對象。
  • 在Promise構造函數中,使用resolve()方法表示操作成功完成,使用reject()方法表示操作失敗。
  • 使用then()方法對Promise對象的成功處理進行定義,使用catch()方法對Promise對象的失敗處理進行定義。
  • 使用Promise.all()方法將多個Promise對象組合成一個新的Promise對象。
  • 使用Promise.race()方法同時執行多個異步操作,只響應最先完成的操作。

七、promise歌曲

在編程社區中,Promise常被稱為一首歌曲的名字。這首歌曲的名字是《Promise》(承諾),由電子音樂人Nero創作。該歌曲曾在2015年艾美獎的廣告類音效設計中獲得提名。

八、promise翻譯

Promise這個單詞的中文翻譯是“承諾”,它的意義與JavaScript中的Promise概念十分貼切。在日常生活中,“承諾”可能更容易理解:當我們做出一個承諾,就會有一個期待的結果。如果我們兌現了承諾,就是成功;如果沒有兌現承諾,就是失敗。

九、permission

Permission(權限)是指用戶在使用應用程序時授予的資源(如攝像頭、麥克風、地理位置等)訪問權限。Promise在處理權限方面也有很好的應用場景。在許多Web應用程序中,需要徵得用戶的同意才能訪問這些資源。而在JavaScript中,我們可以使用Promise來處理用戶授權。

下面是一個簡單的例子:

function askForPermission() {
  return new Promise((resolve, reject) => {
    if (window.confirm('是否授權?')) {
      resolve('授權成功')
    } else {
      reject('授權失敗')
    }
  })
}

askForPermission()
  .then(res => console.log(res))
  .catch(err => console.error(err))

在上面的例子中,我們使用window.confirm()方法來彈出一個確認框,等待用戶做出是否同意授權的決定。如果用戶同意,就使用resolve()方法返回一個成功信息;否則,使用reject()方法返回一個失敗信息。

總結

本文從primitive、premise、promising、premises和promises等方面詳細介紹了Promise的概念和用法,並給出了相關的代碼示例。通過學習本文,讀者可以深入了解Promise的必要性和優雅的異步編程方式。

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
MRONC的頭像MRONC
上一篇 2025-01-16 15:46
下一篇 2025-01-16 15:46

相關推薦

  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、字節與比特 在討論byte轉int之前,我們需要了解字節和比特的概念。字節是計算機存儲單位的一種,通常表示8個比特(bit),即1字節=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟件,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r為前綴的字符串。r字符串中的反斜杠(\)不會被轉義,而是被當作普通字符處理,這使得r字符串可以非常方便…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱“存儲程序控制原理”,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的總線來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25

發表回復

登錄後才能評論