摘要:定義或的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。無(wú)法取消,一旦新建立即執(zhí)行若不設(shè)置回調(diào)函數(shù),則內(nèi)部拋出的異常反應(yīng)不到外部狀態(tài)無(wú)法得知進(jìn)展。
問(wèn)題來(lái)了
Promise 有幾種狀態(tài)?
Promise 有什么優(yōu)缺點(diǎn)?
Promise構(gòu)造函數(shù)是同步還是異步執(zhí)行,then呢?
Promise和setTimeout的區(qū)別?
如何實(shí)現(xiàn) Promise.all?
如何實(shí)現(xiàn) Promise.finally?
1)定義
保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(異步操作)的容器
2)特點(diǎn)
(1)對(duì)象的狀態(tài)不受外界影響。三個(gè)狀態(tài):pending(進(jìn)行中)、fulfilled(已成功)、rejected(已失?。?。只有異步操作的結(jié)果,可以決定當(dāng)前狀態(tài)。
(2)狀態(tài)只能改變一次,任何時(shí)候都能得到該結(jié)果。兩種狀態(tài)改變的情況:pending->fulfilled、pending->rejected。狀態(tài)一直保持,給Promise對(duì)象添加回調(diào)函數(shù),能得到該結(jié)果。
3)優(yōu)缺點(diǎn)
(1)可以將異步操作以同步操作的流程表達(dá)出來(lái),避免了層層嵌套的回調(diào)函數(shù);Promise對(duì)象提供統(tǒng)一的接口,是的控制異常操作更加容易。
(2)無(wú)法取消Promise,一旦新建立即執(zhí)行;若不設(shè)置回調(diào)函數(shù),則Promise內(nèi)部拋出的異常反應(yīng)不到外部;pending狀態(tài)無(wú)法得知進(jìn)展。
1)定義
為Promise實(shí)例添加狀態(tài)改變時(shí)的回調(diào)函數(shù)。.then(resolved的回調(diào)函數(shù),rejected的回調(diào)函數(shù)[可選])
tips:
then方法返回的是一個(gè)新的Promise實(shí)例(不是原來(lái)的那個(gè)Promise實(shí)例),因此可以鏈?zhǔn)?,如?then().then()。
采用鏈?zhǔn)降膖hen,可以指定一組按照次序執(zhí)行的回調(diào)函數(shù)。
1)定義
then(null, rehection)或.then(undefiend, rejection)的別名,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)。
tips:
promise對(duì)象的錯(cuò)誤具有“冒泡”性質(zhì),錯(cuò)誤一直向后傳遞,直至被捕獲。
promise對(duì)象錯(cuò)誤不會(huì)傳遞到外層代碼,即不同于try/catch,(報(bào)錯(cuò)后不會(huì)終止外層代碼執(zhí)行)。
1)定義
不論P(yáng)romise對(duì)象最終狀態(tài)如何,都會(huì)執(zhí)行的操作(ES2018)。本質(zhì)上是then方法的特例。
2)特點(diǎn)
不接受任何參數(shù),不影響原Promise的狀態(tài)。
3)實(shí)際應(yīng)用
post請(qǐng)求loading,在請(qǐng)求結(jié)束后不論結(jié)果如何都關(guān)閉loading
作用:
將多個(gè)Promise實(shí)例,包裝成一個(gè)Promise實(shí)例。
特點(diǎn):
新Promise對(duì)象(p)的狀態(tài)由Promise實(shí)例數(shù)組([p1, p2, p3])決定。
當(dāng)p1、 p2、 p3狀態(tài)都為fulfilled,p的狀態(tài)為fulfilled,p1、p2、p3的返回值組成一個(gè)數(shù)組,傳遞給p的回調(diào)函數(shù)。
當(dāng)p1、 p2、 p3中有一個(gè)狀態(tài)為rejected,p的狀態(tài)為rejected,第一個(gè)被reject的實(shí)例的返回值,會(huì)傳遞給p的回調(diào)函數(shù)。
pending(進(jìn)行中)、fulfilled(已成功)和rejected(已失敗)
2. Promise有什么優(yōu)缺點(diǎn)可以將異步操作以同步操作的流程表達(dá)出來(lái),避免了層層嵌套的回調(diào)函數(shù);Promise對(duì)象提供統(tǒng)一的接口,是的控制異常操作更加容易。
無(wú)法取消Promise,一旦新建立即執(zhí)行;若不設(shè)置回調(diào)函數(shù),則Promise內(nèi)部拋出的異常反應(yīng)不到外部;pending狀態(tài)無(wú)法得知進(jìn)展。
構(gòu)造函數(shù)同步執(zhí)行,then異步執(zhí)行
4. Promise和setTimeout的區(qū)別setTimeout(fn, 0)在下一輪“事件循環(huán)”開(kāi)始時(shí)執(zhí)行,Promise.then()在本輪“事件循環(huán)”結(jié)束時(shí)執(zhí)行。
5.如何實(shí)現(xiàn) Promise.allfunction promiseAll(promises) { return new Promise((resolve, reject) => { let resultCount = 0; let results = new Array(promises.length); for (let i = 0; i < promises.length; i++) { promises[i].then(value => { resultCount++; results[i] = value; if (resultCount === promises.length) { return resolve(results) } }, error => { reject(error) }) } }) } let p1 = new Promise(resolve => resolve("p1")) let p2 = new Promise(resolve => resolve("p2")) let p3 = Promise.reject("p3 error") Promise.all([p1, p2, p3]).then(results => { console.log(results) }).catch(error => { console.log(error) // "p3 error" }) promiseAll([p1, p2]).then(results => { console.log(results) // ["p1", "p2"] }).catch(error => { console.log(error) })6.如何實(shí)現(xiàn) Promise.finally
Promise.prototype.finally = function (callback) { let P = this.constructor; // 構(gòu)造函數(shù) console.log(P); return this.then( value => P.resolve(callback()).then(() => value), // resolve reason => P.resolve(callback()).then(() => { throw reason }) // reject ); };參考文章
《ECMAScript 6 入門(mén)——阮一峰》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/105737.html
摘要:在處理異步回調(diào)函數(shù)的情況有著越來(lái)越值得推崇的方法及類(lèi)庫(kù),下面會(huì)依次介紹處理異步函數(shù)的發(fā)展史,及源碼解讀。而對(duì)象的狀態(tài),是由第一個(gè)的參數(shù)成功回調(diào)函數(shù)或失敗回調(diào)函數(shù)的返回值決定的。 函數(shù)的執(zhí)行分為同步和異步兩種。同步即為 同步連續(xù)執(zhí)行,通俗點(diǎn)講就是做完一件事,再去做另一件事。異步即為 先做一件事,中間可以去做其他事情,稍后再回來(lái)做第一件事情。同時(shí)還要記住兩個(gè)特性:1.異步函數(shù)是沒(méi)有返回值的...
摘要:但是事件循環(huán)一般會(huì)在主線程中任務(wù)執(zhí)行完成之后執(zhí)行。所以,上面函數(shù)的調(diào)用棧過(guò)程如下總結(jié)的事件循環(huán)部分,內(nèi)容應(yīng)該算是全部闡述完全了。 前言 還記得那些年面試官問(wèn)你的定時(shí)器的原理嗎?還有呢?Promise的原理呢?原理、原理、原理,問(wèn)的我們懷疑人生。 為了下次不再懵逼,今天,我們來(lái)了解一下Event Loop的概念。我們的初衷是真正的了解和掌握它,了解整體JavaScript的運(yùn)行機(jī)制。至少...
摘要:只能是同步函數(shù),原因是無(wú)法捕捉異步函數(shù)的快照。除了這三個(gè)概念外,還有類(lèi)比計(jì)算屬性,用于從派生出一些值分割較大的狀態(tài)樹(shù),便于管理。處理表單可手動(dòng)監(jiān)聽(tīng)或是使用帶的雙向綁定計(jì)算屬性。 一、Vue組件的創(chuàng)建 一般語(yǔ)法: Vue.component(tagName, options) 務(wù)必在根組件實(shí)例化之前注冊(cè)組件 組件options說(shuō)明: data: 必須是一個(gè)函數(shù),目的在于返回獨(dú)立的對(duì)象...
摘要:其實(shí)我們?cè)谕搅鞒讨胁耪f(shuō)返回,異步?jīng)]有返回這個(gè)概念或者說(shuō)異步返回是沒(méi)有意義的,異步對(duì)應(yīng)的是回調(diào),也就是說(shuō),對(duì)于一個(gè)異步函數(shù),我們應(yīng)該傳入一個(gè)回調(diào)函數(shù)來(lái)接收結(jié)果。 原文鏈接:https://www.xksblog.top/talk-... 見(jiàn)到wx.request的第一眼,就讓我想起了$.ajax這東西,使用起來(lái)確實(shí)有很多不方便,不能忍,幸好小程序是支持ES6語(yǔ)法的,所以可以使用pro...
摘要:首先從這個(gè)構(gòu)造函數(shù)說(shuō)起,它是全局對(duì)象的屬性的值,這也就是為什么瀏覽器環(huán)境下我們能直接調(diào)用它的原因,就像這些構(gòu)造函數(shù)一樣。的產(chǎn)生就是像正常使用構(gòu)造函數(shù)那樣構(gòu)建一個(gè),不過(guò)傳給構(gòu)造函數(shù)是內(nèi)部自動(dòng)創(chuàng)建的,作用是把記錄到中。 showImg(https://segmentfault.com/img/bVbgYy2?w=1200&h=600); > new Promise((resolve, re...
閱讀 2196·2021-11-16 11:45
閱讀 1352·2021-10-22 09:53
閱讀 4090·2021-09-07 10:26
閱讀 1293·2021-09-06 15:00
閱讀 2136·2019-08-28 18:09
閱讀 2885·2019-08-26 14:06
閱讀 4119·2019-08-26 13:48
閱讀 1364·2019-08-26 12:11