摘要:聲明,只是簡(jiǎn)單地提了提的基本使用,大牛繞道先看一個(gè)例子你需要知道是個(gè)庫(kù)返回一個(gè)實(shí)例你可以把理解為,它們功能相近,只不過(guò)遵循規(guī)范我是第二個(gè)我是第二個(gè)為了防止你對(duì)這個(gè)鏈?zhǔn)秸{(diào)用看得眼花繚亂,我把這個(gè)給簡(jiǎn)化一下成功回調(diào)失敗回調(diào)成功回調(diào)失敗回調(diào),準(zhǔn)備
聲明,只是簡(jiǎn)單地提了提promise的基本使用,大牛繞道^_^1.先看一個(gè)例子
你需要知道
1.axios是個(gè)庫(kù)
2.axios()返回一個(gè)Promise實(shí)例
3.你可以把a(bǔ)xios()理解為$.ajax(),它們功能相近,只不過(guò)axios遵循promise規(guī)范
axios({ url: "." }).then((resolve) => { console.log(resolve) return "我是第二個(gè)then" }, (reject) => { console.log(reject) }).then((resolve_2) => { console.log(resolve_2) // "我是第二個(gè)then" }, (reject_2) => { console.log(reject_2) })
為了防止你對(duì)這個(gè)鏈?zhǔn)秸{(diào)用看得眼花繚亂,我把這個(gè)給簡(jiǎn)化一下
axios({ url: "." }).then(成功回調(diào), 失敗回調(diào)) .then(成功回調(diào)2, 失敗回調(diào)2)
ok,準(zhǔn)備好了嗎?下面我們先來(lái)了解Promise的一些基本概念
2.Promise的基本概念 2.1Promise的作用Promise是專門用來(lái)解決異步編程問(wèn)題的,避免了層層嵌套的回調(diào)函數(shù)[Callback Hell]
下面是一個(gè)用傳統(tǒng)方法Callback Hell來(lái)寫的異步代碼
可以非常明顯地看出來(lái),Callback Hell的方式讓代碼的可讀性變得非常差
function loadImg(src, callback, fail) { let img = new Image() img.onload = function () { // 成功回調(diào) callback(img) } img.onerror = fail // 失敗回調(diào) img.src = src } let src = "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png" loadImg(src, function (img) { console.log(img.width) }, function () { console.log("error") })2.2 Promise的三個(gè)狀態(tài)
pending初始態(tài),既不成功也不失敗
fulfilled異步操作成功
rejected異步操作失敗
Promise對(duì)象代表一個(gè)異步操作,且只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無(wú)法改變這個(gè)狀態(tài),peding可轉(zhuǎn)化為fulfilled與rejected,但fulfilled與rejected不可相互轉(zhuǎn)化
那知道這三個(gè)狀態(tài)又有什么用咧?
OK,我們看下面的代碼
axios({ url: "." }).then(成功回調(diào), 失敗回調(diào))
axios({url: "."})
異步操作成功代表了pending -> fulfilled -> then里的第一個(gè)參數(shù)【成功回調(diào)】
異步操作失敗代表了pending -> rejected -> then里的第二個(gè)參數(shù)【失敗回調(diào)】
因?yàn)?Promise.prototype.then 和 Promise.prototype.catch 方法返回promise 對(duì)象
所以它們可以被鏈?zhǔn)秸{(diào)用。
OK,下面讓我們仔細(xì)看一下回調(diào)觸發(fā)機(jī)制究竟怎樣的過(guò)程
axios({ url: "." }).then(成功回調(diào), 失敗回調(diào)) .then(成功回調(diào)2, 失敗回調(diào)2)
是不是看的有點(diǎn)暈?沒(méi)關(guān)系,下面我來(lái)詳細(xì)解釋一下
1.異步操作成功 -> 進(jìn)入第一個(gè)then的成功回調(diào) -> 成功回調(diào)執(zhí)行異步操作成功 -> 由于又返回了一個(gè)Promise實(shí)例,其狀態(tài)由于異步操作成功,由pending轉(zhuǎn)為了fullfiled,所以還可以再調(diào)用第二個(gè)then -> 進(jìn)入第二個(gè)then的成功回調(diào)2
2.異步操作失敗-> 進(jìn)入第一個(gè)then的失敗回調(diào) -> 失敗回調(diào)執(zhí)行異步操作成功 -> 由于又返回了一個(gè)Promise實(shí)例,其狀態(tài)由于異步操作成功,由pending轉(zhuǎn)為了fullfiled,所以還可以再調(diào)用第二個(gè)then -> 進(jìn)入第二個(gè)then的成功回調(diào)2
你的問(wèn)題:
1.為什么第一個(gè)then不論調(diào)用成功回調(diào)還是失敗回調(diào),第二個(gè)then都會(huì)調(diào)用成功回調(diào)2呢
答:因?yàn)榈诙€(gè)then調(diào)用進(jìn)入哪個(gè)回調(diào)函數(shù),完全是看第一個(gè)then返回的Promise是什么狀態(tài),換言之 —— 看異步操作成功與否
舉一個(gè)栗子
axios({ url: "." }).then((resolve) => { return xxx // 注意xxx是個(gè)未聲明的變量 // 瀏覽器會(huì)報(bào)錯(cuò),說(shuō)明異步操作失敗了 // 所以第一個(gè)then返回的Promise的狀態(tài)是 rejected }, (reject) => {}) .then((resolve_2) => { console.log(1) }, (reject_2) => { // 所以第二個(gè)then只會(huì)調(diào)用它的第二個(gè)參數(shù) console.log(2) })
2.你咋不提catch咧?
因?yàn)?b>catch就是then的一個(gè)語(yǔ)法糖呀
catch等價(jià)于then只有第二個(gè)參數(shù)【失敗回調(diào)】的形式
上面的例子用catch,可以這么寫
axios({ url: "." }).then((fulfilled) => { return xxx // 注意xxx是個(gè)未聲明的變量 // 所以第一個(gè)then返回的Promise的狀態(tài)是 rejected }, (rejected) => { }).catch((rejected) => { // 所以直接進(jìn)入catch console.log(2) })4.自己寫一個(gè)Promise
第一步
// 聲明一個(gè)函數(shù) 讓這個(gè)函數(shù)返回一個(gè)Promise實(shí)例 let setPromise = function () { return new Promise() }
第二步
// new Promise()接受一個(gè)函數(shù) // 規(guī)定這個(gè)函數(shù)必須要有兩個(gè)參數(shù)【成功回調(diào),失敗回調(diào)】 let a = 0 let setPromise = function () { let fn = (x, y) => { setTimeout(() => { x("success") // 一定要寫上異步操作成功后,會(huì)調(diào)用的回調(diào)函數(shù) }, 2000) } return new Promise(fn) // 在new的過(guò)程中一定有一句fn.call(undefined, fulfilled, rejected) }
第三步
// 寫的更裝逼點(diǎn),順別把x,y換個(gè)名字【其實(shí)是規(guī)定】 let setPromise = function () { return new Promise((resolve, reject) => { setTimeout(() => { resolve("success") }, 2000) }) // 在new的過(guò)程中一定有一句fn.call(undefined, fulfilled, rejected) }
第四步
// 你要做什么,就用then輸入到這個(gè)Promise實(shí)例里面去 let promiseInstance = setPromise() promiseInstance.then((success) => { console.log(success) // "success" }, () => { console.log("失敗啦") })
總結(jié)
let setPromise = function () { return new Promise((resolve, reject) => { // 你的異步代碼 setTimeout(() => { resolve("success") // 給成功回調(diào)resolve傳遞一個(gè)參數(shù) "success" console.log("測(cè)試一下") // 兩秒之后被執(zhí)行 }, 2000) }) } // 你要做什么,就用then輸入到這個(gè)Promise實(shí)例里面去 let promiseInstance = setPromise() promiseInstance.then((resolve) => { // 異步操作執(zhí)行成功后執(zhí)行 console.log(resolve) // "success" console.log("完美運(yùn)行") // "完美運(yùn)行" }, () => { console.log("失敗啦") })5.最后
其實(shí)對(duì)于Promise和then有一個(gè)更具象化的理解
Promise的中文翻譯是承諾,then的中文翻譯是然后
所以,你可以想象你去買橘子,結(jié)果店里沒(méi)有進(jìn)貨,店員對(duì)你Promise,只要他店里到貨,then他就會(huì)通知你
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/93767.html
摘要:主要邏輯本質(zhì)上還是回調(diào)函數(shù)那一套。通過(guò)的判斷完成異步和同步的區(qū)分。 主要邏輯: 本質(zhì)上還是回調(diào)函數(shù)那一套。通過(guò)_subscribers的判斷完成異步和同步的區(qū)分。通過(guò) resolve,reject -> publish -> invokeCallback -> resolve,reject的遞歸和下一條then的parent是上一條的child來(lái)完成then鏈的流轉(zhuǎn) 同步情況...
摘要:常見(jiàn)應(yīng)用則是為了完成一些更新應(yīng)用程序狀態(tài)的較小的任務(wù),如處理的回調(diào)和的修改,以便讓這些任務(wù)在瀏覽器重新渲染之前執(zhí)行。常見(jiàn)應(yīng)用執(zhí)行順序的實(shí)現(xiàn)需要至少一個(gè)和至少一個(gè)。 簡(jiǎn)介 我們?cè)谏弦黄?《淺析 JS 中的EventLoop 事件循環(huán)》 中提到一個(gè) Event Queue,其實(shí)在事件循環(huán)中 queue 一共有兩種,還有一種叫 Job Queue 其中 Event Queue 在 HTML...
摘要:核心的異步延遲函數(shù),用于異步延遲調(diào)用函數(shù)優(yōu)先使用原生原本支持更廣,但在的中,觸摸事件處理程序中觸發(fā)會(huì)產(chǎn)生嚴(yán)重錯(cuò)誤的,回調(diào)被推入隊(duì)列但是隊(duì)列可能不會(huì)如期執(zhí)行。 淺析 Vue 2.6 中的 nextTick 方法。 事件循環(huán) JS 的 事件循環(huán) 和 任務(wù)隊(duì)列 其實(shí)是理解 nextTick 概念的關(guān)鍵。這個(gè)網(wǎng)上其實(shí)有很多優(yōu)質(zhì)的文章做了詳細(xì)介紹,我就簡(jiǎn)單過(guò)過(guò)了。 以下內(nèi)容適用于瀏覽器端 JS,...
摘要:淺析的特點(diǎn)之一就是響應(yīng)式,但數(shù)據(jù)更新時(shí),并不會(huì)立即更新。盡管已經(jīng)更新,但新增的元素并不立即插入到中。實(shí)際在中,執(zhí)行了,這也是自動(dòng)綁定到執(zhí)行上下文的原因。在內(nèi),使用數(shù)組保存回調(diào)函數(shù),表示當(dāng)前狀態(tài),使用函數(shù)來(lái)執(zhí)行回調(diào)隊(duì)列。 Vue.nextTick 淺析 Vue 的特點(diǎn)之一就是響應(yīng)式,但數(shù)據(jù)更新時(shí),DOM 并不會(huì)立即更新。當(dāng)我們有一個(gè)業(yè)務(wù)場(chǎng)景,需要在 DOM 更新之后再執(zhí)行一段代碼時(shí),可以...
摘要:前言業(yè)務(wù)開發(fā)中經(jīng)常會(huì)用到異步函數(shù),這里簡(jiǎn)單的對(duì)異步函數(shù)以及它的各種各樣的解決方案做一個(gè)淺析優(yōu)缺點(diǎn)優(yōu)點(diǎn)能夠極大的提高程序并發(fā)業(yè)務(wù)邏輯的能力缺點(diǎn)異步函數(shù)的書寫方式和代碼執(zhí)行邏輯很不直觀,回調(diào)函數(shù)這種方式不太符合人類的的線性思維異步函數(shù)的執(zhí)行流程 前言 業(yè)務(wù)開發(fā)中經(jīng)常會(huì)用到異步函數(shù),這里簡(jiǎn)單的對(duì)異步函數(shù)以及它的各種各樣的解決方案做一個(gè)淺析 優(yōu)缺點(diǎn): 優(yōu)點(diǎn): 能夠極大的提高程序并發(fā)業(yè)務(wù)邏輯的能...
閱讀 857·2021-11-22 11:59
閱讀 3272·2021-11-17 09:33
閱讀 2342·2021-09-29 09:34
閱讀 1976·2021-09-22 15:25
閱讀 1987·2019-08-30 15:55
閱讀 1345·2019-08-30 15:55
閱讀 560·2019-08-30 15:53
閱讀 3381·2019-08-29 13:55