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