欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解ES6 Promise的生命周期和創(chuàng)建

 更新時間:2019年08月18日 08:37:37   作者:nanaistaken  
這篇文章主要介紹了詳解ES6 Promise Promise的生命周期和創(chuàng)建,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一:Promise的概念

Promise的中文意思是‘承諾',什么叫承諾?承諾就是現(xiàn)在沒有發(fā)生,在將來的某個時刻一定會發(fā)生的事情。
放在編程語言的環(huán)境下,Promise就是異步事件的結(jié)果的占位符。我們不用去管異步事件的結(jié)果什么時候來,只需要關(guān)心異步事件的結(jié)果產(chǎn)生的時候,你想要做什么就對了。

二:Promise的生命周期

異步事件不是立即執(zhí)行程序,它的結(jié)果可能要在動作發(fā)生后一段時間才到,所以它有個生命周期。例如用電飯鍋煮米飯,從【米下鍋開始定時】到【定時結(jié)束】,這是煮米飯的生命周期。
一個Promise的生命周期主要有2個階段:

1: unsettled(pending) 處理過程中 -> 米飯定時開始到定時結(jié)束這段期間
2: settled (fulfilled或者rejected) 處理完 -> 米飯定時結(jié)束狀態(tài)

我們看到settled階段會出現(xiàn)兩個可能的狀態(tài)fulfilled或者rejected,它們分別是什么意思呢:

1: fulfilled Promise操作完成的結(jié)果為成功 -> 煮米飯水的比例合適,飯熟了,成功
2: rejected Promise操作完成的結(jié)果為失敗 -> 煮米飯水放少了,飯是夾生的,失敗

Promise內(nèi)部的屬性PromiseState被用來表示Promise的3種狀態(tài):pending,fulfilled 和 rejected。但是我們無法讀取到這三個狀態(tài),而是通過Promise提供的接口方法來書寫對應(yīng)的處理程序,后面會講到。

三:如何讓創(chuàng)建一個Promise

相信前面通過對比煮飯這個過程,你已經(jīng)對Promise的概念和生命周期有了一定的體會,接下來我們就看看如何真正第創(chuàng)建一個Promise(如何煮米飯)。

聲明:因為Promise有未完成的Promise和已完成的Promise不同類型,本篇我們只討論未完成的Promise。已完成的Promise后面會講,目前來說你不必關(guān)心,就當(dāng)世界上沒有這個東西。

通過Promise構(gòu)造函數(shù),可以創(chuàng)建一個Promise。構(gòu)造函數(shù)只有一個參數(shù):一個函數(shù),我們叫它執(zhí)行器(executor)函數(shù)。你可以理解為煮飯用的電飯煲。

既然執(zhí)行器(executor)函數(shù)也是一個函數(shù),那它也有參數(shù)。對,它有2個參數(shù):

1: resolve() 執(zhí)行器(executor)函數(shù)成功時的處理函數(shù)
2: reject() 執(zhí)行器(executor)函數(shù)失敗時的處理函數(shù)

我們用一段代碼來解釋一下:

let executor = function (resolve, reject) {};
let promise = new Promise(executor);

通過上面的代碼示例,應(yīng)該就能很清楚創(chuàng)建一個Promise的語法解構(gòu)是怎樣的了。接下來我們用一個在Node.js中讀取文件的例子來演示:

let executor = function (resolve, reject) {
  let fs = require('fs');
  fs.readFile('data.txt', {encoding: 'utf8'}, function (error, content) {
    if (error) {
      reject(error); //在異步行為失敗時,調(diào)用reject()方法
      return;
    }
    resolve(content); //在異步行為成功時,調(diào)用resolve()方法

  });
};
let promise = new Promise(executor);

解釋一下上面的代碼:

1: 創(chuàng)建Promise,包裹異步程序

Promise本身并不執(zhí)行任何真正的異步程序。我們只是把異步程序包裹在一個Promise里面,這樣做的目的其實(shí)是想把異步處理程序的結(jié)果給Promise,稍后再利用Promise提供的接口函數(shù)(then()或者catch())來對結(jié)果進(jìn)行處理。

2: 我們在Promise的executor函數(shù)里調(diào)用真正的異步操作函數(shù)。

我們在executor函數(shù)里調(diào)用fs.readFile( )函數(shù)。fs.readFile( )函數(shù)本身是一個異步行為,其方法的第三個參數(shù)為一個回調(diào)函數(shù),用來接收文件讀取的結(jié)果(失敗時候的error和成功時候的content)。

3: 把異步程序的結(jié)果給Promise

我們在fs.readFile( )的回調(diào)函數(shù)里,在文件讀取成功時調(diào)用resolve( )方法,失敗的時候調(diào)用reject( )方法,把成功或者失敗的結(jié)果通過2個函數(shù)的參數(shù)傳入,為Promise在fulfilled或者rejected兩種狀態(tài)時提供數(shù)據(jù)。

四:編寫Promise結(jié)果處理程序

前面我們已經(jīng)了解到了怎么把一個異步處理事件包裹在一個Promise里面,并且通過resolve()和reject()把異步處理事件的結(jié)果傳遞的過程。終于來到了最后一步:使用結(jié)果數(shù)據(jù)(對比現(xiàn)實(shí)生活,你也可以理解為這一步叫做:驗證承諾)。
Promise提供2個方法來處理結(jié)果: Promise.prototype.then() 和 Promise.prototype.catch()。我們分別來看一下二者的功能:

1:Promise.prototype.then()

then()方法接收2個函數(shù)類行的參數(shù):

1: 第一個參數(shù)為Promise在fulfilled狀態(tài)(成功狀態(tài))時的回調(diào)方法
2: 第一個參數(shù)為Promise在rejected狀態(tài)(失敗狀態(tài))時的回調(diào)方法
我們以之前的讀取文件為例子,看一下then()方法的使用:

let executor = function (resolve, reject) {
  let fs = require('fs');
  fs.readFile('data.txt', {encoding: 'utf8'}, function (error, content) {
    if (error) {
      reject(error); //在異步行為成功時,調(diào)用reject()方法
      return;
    }
    resolve(content); //在異步行為失敗時,調(diào)用resolve()方法

  });
};
let promise = new Promise(executor);

//處理成功和失敗的情況
promise.then(function (content) {
  console.log(content);

}, function (error) {
  console.log(error)
});

這兩個回調(diào)函數(shù)的參數(shù)也就是之前異步處理的結(jié)果數(shù)據(jù)。第一個函數(shù)的參數(shù)對應(yīng)resolve()的參數(shù)content,第二個回調(diào)函數(shù)對應(yīng)reject()的參數(shù)error。這樣我們也就能在這2個回調(diào)函數(shù)里面拿到數(shù)據(jù),從而根據(jù)你的業(yè)務(wù)需求編寫對應(yīng)的結(jié)果處理程序。

需要說明的是,這兩個回調(diào)函數(shù)參數(shù)都不是必須的,并不強(qiáng)制要求你都要處理。下面的代碼里,列覺了某2種結(jié)果處理程序,語法上都是合法的。只是正常的需求下,我們一般還是需要對成功和失敗都要處理。

 //只處理成功的情況
promise.then(function (content) {
  console.log(content);

});
//只處理失敗的情況
promise.then(null, function (error) {
  console.log(error)
});

2: Promise.prototype.catch()

catch()方法只有一個參數(shù):一個只處理rejected狀態(tài)的回調(diào)函數(shù)??赡軙腥艘蓡枺瑃hen()已經(jīng)可以同時處理2個狀態(tài),為什么還需要catch()方法?

原因在于前面我們提到的,在then()方法里,并不強(qiáng)制要求你提供處理rejected的回調(diào)函數(shù)。Promise有個特性:如果你沒有添加rejected處理函數(shù),那所有的失敗會被自動忽略。

可能會有些開發(fā)者只關(guān)心成功狀態(tài),而忘了提供rejected處理函數(shù),從而給整個程序埋下隱患,這樣會造成很不好的用戶體驗。而catch()方法就是一個明確地處理rejected的方法,而不像在then()里面,因為是非必須參數(shù)而讓人很容易忽略。

背景說了那么多,我們看看catch()怎么用:

promise.catch(function (error) {
  console.log(error)
})

其實(shí)用法很簡單,它其實(shí)等價于是有reject處理函數(shù)的then():

promise.then(null, function (error) {
  console.log(error)
});

沒有語法要求一個完整的Promise處理程序必須要有catch()方法。如果你沒有使用catch()的習(xí)慣,最好總是不要忘記在使用then()的時候添加reject處理函數(shù)。

或者,如果你偶爾會忘記在then()里添加reject處理函數(shù),那么記得使用catch()來為你做最安全的保障。

以上,就是關(guān)于Promise的基本概念和使用。在平常的開發(fā)中,Promise的使用還是非常頻繁的,也很好用,所以我認(rèn)為掌握Promise是一個必須的功課。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript和TypeScript中的void的具體使用

    JavaScript和TypeScript中的void的具體使用

    這篇文章主要介紹了JavaScript和TypeScript中的void的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 關(guān)于layer.js使用心得-向彈出框傳值問題

    關(guān)于layer.js使用心得-向彈出框傳值問題

    這篇文章主要介紹了關(guān)于layer.js使用心得-向彈出框傳值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 基于javascript實(shí)現(xiàn)的購物商城商品倒計時實(shí)例

    基于javascript實(shí)現(xiàn)的購物商城商品倒計時實(shí)例

    本文主要介紹了基于javascript實(shí)現(xiàn)的購物商城商品倒計時實(shí)例,代碼詳細(xì),可直接復(fù)制試試看效果。需要的朋友可以參考借鑒
    2016-12-12
  • JavaScript下利用fso判斷文件是否存在的代碼

    JavaScript下利用fso判斷文件是否存在的代碼

    JavaScript下利用fso判斷文件是否存在的代碼,需要的朋友可以參考下,這個一般需要運(yùn)行確認(rèn)的。
    2010-12-12
  • javascript簡寫常用的12個技巧(可以大大減少你的js代碼量)

    javascript簡寫常用的12個技巧(可以大大減少你的js代碼量)

    這篇文章主要跟大家分享了javascript簡寫常用的12個技巧,通過這12個技巧可以大大減少你的js代碼量,看懂一種是入門,全懂就是大神,你能知道幾個呢?需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-08-08
  • JS實(shí)現(xiàn)左右無縫輪播圖代碼

    JS實(shí)現(xiàn)左右無縫輪播圖代碼

    這篇文章主要介紹了JS實(shí)現(xiàn)左右無縫輪播圖代碼的相關(guān)資料,小編看本段代碼非常不錯,具有參考借鑒價值,特此分享腳本之家平臺,需要的朋友可以參考下
    2016-05-05
  • javascript內(nèi)置對象Math案例總結(jié)分析

    javascript內(nèi)置對象Math案例總結(jié)分析

    今天總結(jié)一下javascript 內(nèi)置對象Math中的函數(shù)用法,順帶寫一下常見的案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • javascript 表格左右收縮

    javascript 表格左右收縮

    javascript 表格左右收縮實(shí)現(xiàn)代碼。
    2009-07-07
  • 微信小程序請求前置的方法詳解

    微信小程序請求前置的方法詳解

    這篇文章主要給大家介紹了關(guān)于微信小程序請求前置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 微信小程序全局配置及常用配置項詳解

    微信小程序全局配置及常用配置項詳解

    微信小程序中我們創(chuàng)建頁面時會自動創(chuàng)建四個文件分別為js文件,wxml文件wxss文件最后還有我們今天的主角配置文件,下面這篇文章主要給大家介紹了關(guān)于微信小程序全局配置以及常用配置項的相關(guān)資料,需要的朋友可以參考下
    2022-11-11

最新評論