最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中的Promise用法大全(非常詳細(xì)!)

 更新時(shí)間:2025年05月16日 09:50:53   作者:M博士  
Promise是JavaScript中的一種對(duì)象,用于表示一個(gè)在未來(lái)某個(gè)時(shí)間點(diǎn)才會(huì)完成(或失?。┑漠惒讲僮骷捌浣Y(jié)果,下面這篇文章主要給大家介紹了關(guān)于JavaScript中Promise用法的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下

一、相關(guān)概念介紹

1.什么是Promise

在JavaScript中,Promise是一個(gè)用于進(jìn)行異步編程的構(gòu)造函數(shù)。它是ES6中引入的一個(gè)重要概念,用于處理異步操作。Promise是JavaScript中用于處理異步操作的對(duì)象,它代表了一個(gè)尚未完成但最終會(huì)完成或失敗的操作。Promise的目的是以更優(yōu)雅的方式書(shū)寫(xiě)復(fù)雜的異步任務(wù),從而提高代碼的可讀性和可維護(hù)性。

2.Promise狀態(tài)

Promise對(duì)象代表一個(gè)異步操作,有三種狀態(tài):Pending(進(jìn)行中)、Resolved(已完成)和Rejected(已失敗)。

  • 當(dāng)Promise被創(chuàng)建后,它的狀態(tài)是Pending。
  • 當(dāng)操作成功完成,它的狀態(tài)變成fulfilled,并傳遞一個(gè)值作為成功的結(jié)果。此時(shí),then中的用于處理成功操作的回調(diào)會(huì)被執(zhí)行。
  • 當(dāng)操作失敗,它的狀態(tài)變成rejected,并傳遞失敗的原因。此時(shí),then中的用于處理失敗操作的回調(diào)會(huì)被執(zhí)行。

3.創(chuàng)建Promise

通過(guò)構(gòu)造函數(shù)創(chuàng)建一個(gè)Promise對(duì)象,構(gòu)造函數(shù)接收一個(gè)函數(shù)作為參數(shù),該函數(shù)的兩個(gè)參數(shù)分別是resolve和reject。resolve函數(shù)的作用是將Promise對(duì)象的狀態(tài)從Pending變?yōu)镽esolved,在then方法中傳入的回調(diào)函數(shù)會(huì)被調(diào)用。reject函數(shù)的作用是將Promise對(duì)象的狀態(tài)從Pending變?yōu)镽ejected,在catch方法中傳入的回調(diào)函數(shù)會(huì)被調(diào)用。

4.then()方法

  • Promise對(duì)象身上有then方法,可用來(lái)指定回調(diào),對(duì)成功和失敗的結(jié)果進(jìn)行處理。
  • then() 接受兩個(gè)參數(shù),一個(gè)處理成功狀態(tài)的回調(diào),另一個(gè)是處理失敗狀態(tài)的回調(diào)。
  • then()返回的是一個(gè)Promise對(duì)象,支持鏈?zhǔn)秸{(diào)用。
  • then()方法中不能改變Promise的狀態(tài)。

5.catch方法

Promise對(duì)象的catch方法用于捕獲鏈中的任何一步的錯(cuò)誤。

6.鏈?zhǔn)秸{(diào)用

  • then()和catch都會(huì)返回Promise對(duì)象,所以可以使用鏈?zhǔn)秸{(diào)用來(lái)處理多個(gè)異步操作,解決了多層嵌套的問(wèn)題。
  • 可以解決異步編程回調(diào)地獄的問(wèn)題。

7.異步編程

在JS中,Promise是一個(gè)代表了異步操作最終完成或失敗,及其結(jié)果值的對(duì)象。它允許開(kāi)發(fā)人員為異步操作的成功和失敗情況注冊(cè)處理程序,極大地簡(jiǎn)化了異步編程的復(fù)雜性。

二、使用

1.構(gòu)造Promise

new Promise(function(resolve,rejecrt)
{
    //異步操作
    //.......
    //操作成功
    resolve("success");
}).then(value=>{
    console.log(value);
});

Promise構(gòu)造函數(shù)接受一個(gè)函數(shù)類(lèi)型的參數(shù)executor,我們稱(chēng)executor為執(zhí)行器函數(shù)。

2.executor 函數(shù)

  • executor 函數(shù)在 Promise 構(gòu)造函數(shù)中是作為一個(gè)參數(shù)被傳入,并在 Promise 對(duì)象被創(chuàng)建后立即執(zhí)行。 executor可以是用function申明的函數(shù),也可以是箭頭函數(shù)。
  • executor 函數(shù)帶有 resolve 和 reject 兩個(gè)函數(shù)類(lèi)型的參數(shù) 。當(dāng)調(diào)用任意一個(gè)參數(shù)時(shí),會(huì)改變 Promise 對(duì)象的狀態(tài)。
  • 異步操作成功時(shí),調(diào)用 resolve 函數(shù), Promise 對(duì)象的狀態(tài)就會(huì)由 pending 變?yōu)?nbsp;fulfilled(已兌現(xiàn)),并返回 executor 函數(shù)中 resolve 的參數(shù)(成功的值)。
  • 異步操作失敗時(shí),調(diào)用 reject 函數(shù), Promise 對(duì)象的狀態(tài)就會(huì)由 pending 變?yōu)閞ejected(已拒絕),并返回 executor 函數(shù)中 reject 的參數(shù)(失敗的原因)。
  • executor 中拋出的任何錯(cuò)誤都會(huì)導(dǎo)致 Promise 被拒絕,并且返回值將被忽略。

3.then() 方法

const p1= new Promise(function(resolve,rejecrt)
{
    setTimeout(() => {
        var currentSecond = new Date().getSeconds();
        //獲取當(dāng)前時(shí)間的秒數(shù),若為偶數(shù)則操作成功,否則為操作失敗
        if(currentSecond%2===0)
        {
            //操作成功
            resolve(currentSecond);//p1的狀態(tài)轉(zhuǎn)變成fulfilled
            console.log(p1);
        }
        else
        {
            rejecrt(new Error(currentSecond));//操作失敗,p1的狀態(tài)轉(zhuǎn)變成rejected
            console.log(p1);
        }
    }, 1000);

})
p1.then(value=>{
        console.log("success: "+value);//處理操作成功的情況
    })
.catch(error=>{
    console.error(error);//處理失敗的情況
});

由運(yùn)行結(jié)果可知:

  • reject函數(shù)用于將Promise狀態(tài)轉(zhuǎn)成rejected狀態(tài),并傳遞一個(gè)原因作為失敗的結(jié)果。
  • resolve函數(shù)用于將Promise狀態(tài)轉(zhuǎn)成fulfilled狀態(tài),并傳遞一個(gè)值作為成功的結(jié)果。
  • Promise狀態(tài)轉(zhuǎn)成fulfilled時(shí),執(zhí)行then方法。當(dāng)狀態(tài)轉(zhuǎn)成rejected時(shí),被catch捕獲。

4.then() 方法返回的Promise的狀態(tài)

下面的3段代碼將討論:根據(jù)回調(diào)函數(shù)返回值的不同類(lèi)型,確定then() 方法返回的Promise對(duì)象的狀態(tài)值。
第1種情況:promise操作成功,回調(diào)函數(shù)返回非Promise對(duì)象

const promise= new Promise(function(resolve,rejecrt)
{
    //操作成功
    resolve('success');//p1的狀態(tài)轉(zhuǎn)變成fulfilled
})
const p1=promise.then(value=>{//接受promise成功的回調(diào)
        return '345678'
    },reason=>{})
console.log(p1);

第二種情況:promise操作失敗,回調(diào)函數(shù)返回非Promise對(duì)象

const promise= new Promise(function(resolve,rejecrt)
{
    //失敗成功
    rejecrt('fail');//p1的狀態(tài)轉(zhuǎn)變成fulfilled
})
const p1=promise.then(value=>{},reason=>{
        return '123456'
    })
console.log(p1);

promise回調(diào)函數(shù)拋出異常

const promise= new Promise(function(resolve,rejecrt)
{
    //操作成功
    resolve('success');//p1的狀態(tài)轉(zhuǎn)變成fulfilled
})
const p1=promise.then(value=>{//在回調(diào)函數(shù)中拋出異常
        throw '出錯(cuò)了'
    },reason=>{})
console.log(p1);

promise回調(diào)函數(shù)返回Promise對(duì)象

const promise= new Promise(function(resolve,rejecrt)
{
    //操作成功
    resolve('success');//p1的狀態(tài)轉(zhuǎn)變成fulfilled
})
const p1=promise.then(value=>{
        //回調(diào)函數(shù)返回Promise對(duì)象
        return new Promise((resolve,rejecrt)=>{
            resolve('成功了');
        })
    },reason=>{})
console.log(p1);

根據(jù)上面的四種情況,我們可以得出結(jié)論如下:

  • 1)promise操作成功,回調(diào)函數(shù)返回非Promise對(duì)象,p1的狀態(tài)是fulfilled
  • 2)promise操作失敗,回調(diào)函數(shù)返回非Promise對(duì)象,p1的狀態(tài)是fulfilled
  • 3)promise回調(diào)函數(shù)拋出異常,p1的狀態(tài)是rejected
  • 4)回調(diào)函數(shù)的返回結(jié)果是promise對(duì)象,則p1的狀態(tài)就取決于return返回的這個(gè)promise對(duì)象內(nèi)部的狀態(tài),內(nèi)部為resolve, 則p1狀態(tài)為fulfilled,內(nèi)部為reject,則p1狀態(tài)為rejected

三、Async/Await語(yǔ)法糖

‌Async/Await是基于Promise的語(yǔ)法糖‌,使得異步代碼的編寫(xiě)更加簡(jiǎn)潔和易于理解。使用async關(guān)鍵字聲明異步函數(shù),await關(guān)鍵字用于在函數(shù)中等待Promise的解析。await只能在async函數(shù)內(nèi)部使用。

async function asyncFunction() {
  console.log("程序開(kāi)始");
  const promise = new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("兩秒后,耗時(shí)的任務(wù)操作成功");
    }, 2000);
  });
  const result = await promise; // 等待promise解析
  console.log(result); // 輸出: Resolved
}

console.log(asyncFunction()); // 調(diào)用異步函數(shù)
console.log('程序結(jié)束')

  • async 標(biāo)記的函數(shù)是個(gè)Promise對(duì)象。
  • 如果表達(dá)式是promise對(duì)象并且狀態(tài)為成功,那么await將返回的是這個(gè)promise對(duì)象成功的值。
  • 如果表達(dá)式是promise對(duì)象,并且它失敗了,那么就要通過(guò)try,catch進(jìn)行捕獲錯(cuò)誤,不捕獲錯(cuò)誤那么后面代碼無(wú)法執(zhí)行.

四、Promise應(yīng)用場(chǎng)景

  • 定時(shí)器:可以使用 Promise 來(lái)管理定時(shí)器操作,譬如延遲執(zhí)行某個(gè)任務(wù)或定時(shí)輪詢(xún)服務(wù)器。
  • Ajax 請(qǐng)求:使用 Promise 可以更方便地管理 Ajax 請(qǐng)求。例如,在使用 Fetch API ,Axios或其他 Ajax 庫(kù)時(shí),可以將異步操作封裝在 Promise 中,以便更好地處理成功和失敗的情況 。
  • 文件操作:在文件的讀、寫(xiě)或上傳等操作時(shí),Promise 可以提供更清晰的代碼結(jié)構(gòu)和錯(cuò)誤機(jī)制處理。

五、總結(jié)

Promise 是一種用于處理異步操作的 JavaScript 對(duì)象,它提供了一種更清晰、更可靠的方式來(lái)管理異步代碼。以下是 Promise 的主要特點(diǎn)和優(yōu)勢(shì)的總結(jié):

  • 簡(jiǎn)化異步操作:Promise 可以幫助我們更輕松地處理異步操作,以及在操作完成后執(zhí)行相應(yīng)的邏輯。
  • 鏈?zhǔn)秸{(diào)用:鏈?zhǔn)秸{(diào)用使得多個(gè)異步任務(wù)能夠順序執(zhí)行,每個(gè)任務(wù)的輸出可以作為下一個(gè)任務(wù)的輸入。這種方式大大提高了代碼的可讀性和可維護(hù)性。與嵌套回調(diào)相比,鏈?zhǔn)秸{(diào)用避免了多層嵌套,使代碼更為扁平和直觀。
  • 錯(cuò)誤處理機(jī)制:如果鏈?zhǔn)秸{(diào)用中任意一個(gè) Promise 被拒絕(rejected),后續(xù)的 then() 將會(huì)跳過(guò),直接進(jìn)入下一個(gè) catch()。這是 Promise 鏈中獨(dú)特的錯(cuò)誤處理機(jī)制,確保開(kāi)發(fā)者能夠集中處理異步操作中的錯(cuò)誤。
  • 異步任務(wù)的順序執(zhí)行:當(dāng)我們需要依次執(zhí)行多個(gè)異步操作時(shí),鏈?zhǔn)秸{(diào)用可以提供非常簡(jiǎn)潔的代碼結(jié)構(gòu)。
  • 避免回調(diào)地獄::Promise 可以解決回調(diào)地獄問(wèn)題,使代碼結(jié)構(gòu)更加清晰和易于理解。Promise.then返回的也是一個(gè)promise對(duì)象,因此可以進(jìn)行鏈?zhǔn)秸{(diào)用。這也是promise可以解決異步編程回調(diào)地獄的原因。

到此這篇關(guān)于JavaScript中Promise用法大全的文章就介紹到這了,更多相關(guān)JS中Promise用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript求解最長(zhǎng)回文子串的方法分享

    JavaScript求解最長(zhǎng)回文子串的方法分享

    這篇文章主要為大家介紹了JavaScript求解最長(zhǎng)回文子串的幾種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • js 為label標(biāo)簽和div標(biāo)簽賦值的方法

    js 為label標(biāo)簽和div標(biāo)簽賦值的方法

    這篇文章介紹了js 為label標(biāo)簽和div標(biāo)簽賦值的方法,有需要的朋友可以參考一下
    2013-08-08
  • 如何使用big.js解決JavaScript浮點(diǎn)數(shù)精度丟失問(wèn)題

    如何使用big.js解決JavaScript浮點(diǎn)數(shù)精度丟失問(wèn)題

    最近在項(xiàng)目中涉及到金額從元轉(zhuǎn)為分(乘100即可),發(fā)現(xiàn)乘法居然也會(huì)有精度丟失的問(wèn)題,關(guān)于浮點(diǎn)數(shù)計(jì)算精度丟失是很多語(yǔ)言都存在的問(wèn)題,本文給大家分享使用big.js解決JavaScript浮點(diǎn)數(shù)精度丟失問(wèn)題,感興趣的朋友一起看看吧
    2023-12-12
  • JS 通過(guò)系統(tǒng)時(shí)間限定動(dòng)態(tài)添加 select option的實(shí)例代碼

    JS 通過(guò)系統(tǒng)時(shí)間限定動(dòng)態(tài)添加 select option的實(shí)例代碼

    這篇文章主要介紹了JS 通過(guò)系統(tǒng)時(shí)間限定 動(dòng)態(tài)添加 select option的實(shí)例代碼,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • 20個(gè)必會(huì)的JavaScript面試題(小結(jié))

    20個(gè)必會(huì)的JavaScript面試題(小結(jié))

    這篇文章主要介紹了20個(gè)必會(huì)的JavaScript面試題(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • TypeScript聲明文件的實(shí)現(xiàn)示例

    TypeScript聲明文件的實(shí)現(xiàn)示例

    TypeScript聲明文件是一種包含TypeScript類(lèi)型信息的.d.ts文件,它允許開(kāi)發(fā)者為已存在的JavaScript代碼提供類(lèi)型注解,這些文件不包含可執(zhí)行代碼,下面就來(lái)詳細(xì)的介紹一下TypeScript聲明文件的實(shí)現(xiàn),感興趣的可以了解一下
    2025-12-12
  • uniapp?APP消息推送方案實(shí)現(xiàn)全過(guò)程

    uniapp?APP消息推送方案實(shí)現(xiàn)全過(guò)程

    前段時(shí)間開(kāi)發(fā)app的時(shí)候要開(kāi)始做消息推送功能了,下面這篇文章主要給大家介紹了關(guān)于uniapp?APP消息推送方案實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • javascript提取內(nèi)容到作為文章簡(jiǎn)介的代碼

    javascript提取內(nèi)容到作為文章簡(jiǎn)介的代碼

    javascript提取文本框內(nèi)容到另一個(gè)文本框,經(jīng)常被用來(lái)做內(nèi)容簡(jiǎn)介的讀取,這樣編輯就不用每次都去處理一篇文章的簡(jiǎn)介了。
    2011-01-01
  • JS鼠標(biāo)事件大全 推薦收藏

    JS鼠標(biāo)事件大全 推薦收藏

    JS鼠標(biāo)事件大全 推薦收藏,整理的比較細(xì),推薦大家看下。
    2011-11-11
  • 關(guān)于延遲加載JavaScript

    關(guān)于延遲加載JavaScript

    當(dāng)一個(gè)網(wǎng)站有很多js代碼要加載,js代碼放置的位置在一定程度上將會(huì)影像網(wǎng)頁(yè)的加載速度,為了讓我們的網(wǎng)頁(yè)加載速度更快,本文總結(jié)了一下幾個(gè)注意點(diǎn),分享給大家
    2015-05-05

最新評(píng)論

依兰县| 报价| 惠州市| 广安市| 青河县| 上杭县| 林甸县| 祁连县| 江华| 清流县| 孝感市| 安义县| 尼勒克县| 冷水江市| 敖汉旗| 陵川县| 广宗县| 安新县| 平泉县| 津南区| 安岳县| 德格县| 盐源县| 石首市| 岱山县| 扎鲁特旗| 永登县| 浦江县| 达拉特旗| 新民市| 收藏| 江陵县| 绥阳县| 连山| 五原县| 宁津县| 视频| 鄂托克前旗| 天台县| 罗田县| 稻城县|