摘要:對象用于表示一個異步操作的最終狀態(tài)完成或失敗,以及其返回的值。構(gòu)造函數(shù)執(zhí)行時立即調(diào)用函數(shù),和兩個函數(shù)作為參數(shù)傳遞給函數(shù)在構(gòu)造函數(shù)返回新建對象前被調(diào)用。與回調(diào)函數(shù)返回的結(jié)果為不同,的結(jié)果為。
Promise 對象用于表示一個異步操作的最終狀態(tài)(完成或失敗),以及其返回的值。大多數(shù)人都在使用由其他函數(shù)創(chuàng)建并返回的
promise對象是由關(guān)鍵字 new 及其構(gòu)造函數(shù)來創(chuàng)建的。該構(gòu)造函數(shù)會?把一個叫做“處理器函數(shù)”(executor function)的函數(shù)作為它的參數(shù)。這個“處理器函數(shù)”接受兩個函數(shù)——resolve 和 reject ——作為其參數(shù)。當(dāng)異步任務(wù)順利完成且返回結(jié)果值時,會調(diào)用 resolve 函數(shù);而當(dāng)異步任務(wù)失敗且返回失敗原因(通常是一個錯誤對象)時,會調(diào)用reject 函數(shù)。
語法new Promise( function(resolve, reject) {...} /* executor */ );
參數(shù)
executor
executor是帶有 resolve 和 reject 兩個參數(shù)的函數(shù) 。Promise構(gòu)造函數(shù)執(zhí)行時立即調(diào)用executor 函數(shù), resolve 和 reject 兩個函數(shù)作為參數(shù)傳遞給executor(executor 函數(shù)在Promise構(gòu)造函數(shù)返回新建對象前被調(diào)用)。resolve 和 reject 函數(shù)被調(diào)用時,分別將promise的狀態(tài)改為fulfilled(完成)或rejected(失敗)。executor 內(nèi)部通常會執(zhí)行一些異步操作,一旦完成,可以調(diào)用resolve函數(shù)來將promise狀態(tài)改成fulfilled,或者在發(fā)生錯誤時將它的狀態(tài)改為rejected。
如果在executor函數(shù)中拋出一個錯誤,那么該promise 狀態(tài)為rejected。executor函數(shù)的返回值被忽略。
流程
Promise有以下幾種狀態(tài):方法
pending: 初始狀態(tài),既不是成功,也不是失敗狀態(tài)。
fulfilled: 意味著操作成功完成。 調(diào)用resolve方法傳遞值到then方法調(diào)用promise的then里面的onFullfillment()
rejected: 意味著操作失敗。 調(diào)用reject方法傳遞值到then方法調(diào)用promise的then里面的onReject();或者調(diào)用promise的catch()
Promise.prototype.then(onFulfilled, onRejected):添加一個拒絕(rejection) 回調(diào)到當(dāng)前 promise, 返回一個新的promise。
Promise.prototype.catch(onRejected);
Promise.prototype.finally(onFinally)
1)、Promise.prototype.then(onFulfilled,onRejected); 處理Promise狀態(tài)變?yōu)閞ejected或fulfilled
最多需要有兩個參數(shù):Promise 的成功和失敗情況的回調(diào)函數(shù)。
如果忽略針對某個狀態(tài)的回調(diào)函數(shù)參數(shù),這個新 Promise 只是簡單地接受調(diào)用這個 then 的原 Promise的終態(tài)作為它的終態(tài)。
如果傳入的參數(shù) 不是函數(shù),則會在內(nèi)部被替換為(x) => x ,即原樣返回 promise 最終結(jié)果的函數(shù)。
參數(shù):onFulfilled回調(diào)函數(shù)的參數(shù)為(the fulfillment value),onRejected 回調(diào)函數(shù)的參數(shù)為(the rejection reason)。
返回值:返回一個Promise,而它的行為與then中的回調(diào)函數(shù)的返回值有關(guān)。
1、then的回調(diào)函數(shù)返回一個值,then返回一個完成狀態(tài)的Promise;
2、then的回調(diào)函數(shù)拋出一個錯誤,then返回一個拒絕狀態(tài)的Promise
3、then的回調(diào)函數(shù)返回一個已完成或已拒絕Promise,then返回一個相同狀態(tài)和值的Promise;
4、then的回調(diào)函數(shù)返回一個Pending的Pormise,then返回一個狀態(tài),完成和拒絕回調(diào)函數(shù)一樣的Promise
2)、Promise.prototype.catch(onRejected)方法返回一個Promise,并且處理拒絕的情況。 在resolve()后面拋出的錯誤會被忽略
事實(shí)上, calling obj.catch(onRejected) 內(nèi)部calls obj.then(undefined, onRejected)
參數(shù):onRejected 回調(diào)函數(shù)的參數(shù)為(the rejection reason)。
返回值:返回一個Promise,回調(diào)函數(shù)onRejected 拋出一個錯誤或返回一個本身失敗的 Promise , 返回的rejected 的Promise;否則,返回完成狀態(tài)的Promise;
3)、Promise.prototype.finally(): 方法返回一個Promise,在執(zhí)行then()和catch()后,都會執(zhí)行finally指定的回調(diào)函數(shù)。避免同樣的語句需要在then()和catch()中各寫一次的情況。回調(diào)函數(shù)無入?yún)?/b>,返回的新Promise默認(rèn)返回當(dāng)前Promise的(the fulfillment value)或(the rejection reason)。
與Promise.resolve(2).then(() => {}, () => {}) (回調(diào)函數(shù)返回undefined)(resolved的結(jié)果為undefined)不同,Promise.resolve(2).finally(() => {}) resolved的結(jié)果為 2。
同樣,Promise.reject(3).then(() => {}, () => {})(回調(diào)函數(shù)返回undefined) (resolved 的結(jié)果為undefined), Promise.reject(3).finally(() => {}) rejected 的結(jié)果為 3。
finally的回調(diào)函數(shù)拋出錯誤或返回rejected狀態(tài)的Promise,finally將返回一個rejected的Promise.
4)、Promise.all(iterable)
參數(shù):一個可迭代對象,如 Array 或 String。
返回值:
1、如果傳入的參數(shù)是一個空的可迭代對象或無任何Promise對象,返回已完成(already resolved)狀態(tài)的 Promise。空可迭代對象同步返回。
2、其他情況,異步返回一個處理中(pending)的Promise。
all返回的Promise完成狀態(tài)的結(jié)果都是一個數(shù)組,它包含所有的傳入迭代參數(shù)對象的值(也包括非 promise 值)。有一個Promise失敗的時候,失敗的那個結(jié)果給失敗狀態(tài)的回調(diào)函數(shù),而不管其它 promise 是否完成。
5)、Promise.race(iterable) 方法返回一個 pending promise,一旦迭代器中的某個promise解決或拒絕,返回的 promise就會解決或拒絕。
參數(shù):一個可迭代對象,如 Array 或 String。
返回值:如果傳的迭代是空的,則返回的 promise 將永遠(yuǎn)等待;如果迭代包含一個或多個Promise和/或已解決/拒絕的Promise,則 Promise.race 將解析為迭代中找到的第一個值。
6)、Promise.reject(reason)方法返回一個帶有拒絕原因reason參數(shù)的Promise對象。
7)、Promise.resolve(value)方法返回一個以給定值解析后的Promise 對象。
參數(shù):Promise對象解析的參數(shù)。也可以是一個Promise對象,或者是一個thenable。
返回值:一個解析過帶著給定值的Promise對象,如果返回值是一個promise對象,則直接返回這個Promise對象。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/97319.html
摘要:意味著操作成功完成。方法接收失敗情況的回調(diào)函數(shù)作為參數(shù),返回一個對象。參數(shù)回調(diào)函數(shù)不接收任何參數(shù),當(dāng)對象變成狀態(tài)時被調(diào)用。現(xiàn)在各個方法的參數(shù)返回值功能和使用方法已經(jīng)有個大概的了解了,為了進(jìn)一步理解其原理,接下來我打算簡單地實(shí)現(xiàn)一下它。 前言 最近幾周參加筆試面試,總是會遇到實(shí)現(xiàn)異步和處理異步的問題,然而作者每次都無法完美地回答。在最近一次筆試因?yàn)?Promise 而被刷掉后,我終于下定...
摘要:反之,操作失敗,對象由狀態(tài)轉(zhuǎn)換為狀態(tài),此時回調(diào)函數(shù)會執(zhí)行方法。這里需要注意的是,雖然在之后便執(zhí)行了方法,但是并不是意味著往后的對象不執(zhí)行了,其他的還是對象還是要執(zhí)行的,只是不會再調(diào)用函數(shù)。 在 掘金上看見一篇寫promise的文章,感覺作者寫的很棒,文章鏈接在這:八段代碼徹底掌握 Promise 。看完之后感覺學(xué)到了很多,所以又重新把JavaScript Promise迷你書(中文版)...
摘要:總結(jié)用方法創(chuàng)建對象用或添加對象的處理函數(shù)它的作用是為實(shí)例添加狀態(tài)改變時的回調(diào)函數(shù)。方法是的別名,用于指定發(fā)生錯誤時的回調(diào)函數(shù)。 一、為什么需要Promise Javascript 采用回調(diào)函數(shù)(callback)來處理異步編程。從同步編程到異步回調(diào)編程有一個適應(yīng)的過程,但是如果出現(xiàn)多層回調(diào)嵌套,也就是我們常說的回調(diào)金字塔(Pyramid of Doom),絕對是一種糟糕的編程體驗(yàn)。于是...
摘要:方法是的別名,用于指定發(fā)生錯誤時的回調(diào)函數(shù)。由于字符串不屬于異步操作判斷方法是字符串對象不具有方法,返回實(shí)例的狀態(tài)從一生成就是,所以回調(diào)函數(shù)會立即執(zhí)行。出錯了等同于出錯了出錯了上面的代碼生成一個對象的實(shí)例,狀態(tài)為,回調(diào)函數(shù)會立即執(zhí)行。 引言 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)和事件——更合理且強(qiáng)大。最近的項目要用到這個,就參照阮一峰老師的《ES6標(biāo)準(zhǔn)入門...
摘要:的實(shí)現(xiàn)說明沒有執(zhí)行里的函數(shù)說明執(zhí)行了里的函數(shù)說明執(zhí)行里的函數(shù)過程中出現(xiàn)錯誤和執(zhí)行狀態(tài)時的回調(diào)函數(shù)后返回的結(jié)果都需要執(zhí)行傳進(jìn)來的對象不能等于當(dāng)前的對象回調(diào)返回的值或者的值是對象時需要等待該對象的狀態(tài)變更設(shè)置當(dāng)前狀態(tài)的狀態(tài)和值執(zhí)行回調(diào)隊列里的函 function resolve_promise_value(promise,value) {//PromiseA+的實(shí)現(xiàn) var th...
摘要:則是把類似的異步處理對象和處理規(guī)則進(jìn)行規(guī)范化,并按照采用統(tǒng)一的接口來編寫,而采取規(guī)定方法之外的寫法都會出錯。這個對象有一個方法,指定回調(diào)函數(shù),用于在異步操作執(zhí)行完后執(zhí)行回調(diào)函數(shù)處理。到目前為止,已經(jīng)學(xué)習(xí)了創(chuàng)建對象和用,方法來注冊回調(diào)函數(shù)。 Promise 本文從js的異步處理出發(fā),引入Promise的概念,并且介紹Promise對象以及其API方法。 js里的異步處理 可以參考這篇文章...
閱讀 2547·2023-04-26 00:57
閱讀 918·2021-11-25 09:43
閱讀 2226·2021-11-11 16:55
閱讀 2224·2019-08-30 15:53
閱讀 3599·2019-08-30 15:52
閱讀 1464·2019-08-30 14:10
閱讀 3383·2019-08-30 13:22
閱讀 1216·2019-08-29 11:18