摘要:前言使用中,鏈?zhǔn)降恼{(diào)用對于控制異步執(zhí)行很重要。的鏈?zhǔn)秸{(diào)用是支持鏈?zhǔn)秸{(diào)用的,但是它是不同于上面的鏈?zhǔn)?。是調(diào)用方法返回自身,但是是調(diào)用方法后返回一個新的。的運行機制請參考的運行機制值穿透由于通過沒有成功添加回調(diào)函數(shù),發(fā)生了值穿透。
前言
使用Promise中,鏈?zhǔn)降恼{(diào)用對于控制異步執(zhí)行很重要。
鏈?zhǔn)秸{(diào)用在jQuery的使用中,我們常常使用下面的代碼
$("#app").show().css("color","red");
這是因為jQuery的對象在調(diào)用上述方法的時候,會return此對象本身, 以方便后面可以繼續(xù)調(diào)用此對象的方法。
jQuery.fn.css = function(prop, value) { ...... return this; } jQuery.fn.show = function() { ...... return this; }Promise的鏈?zhǔn)秸{(diào)用
Promise是支持鏈?zhǔn)秸{(diào)用的,但是它是不同于上面jQuery的鏈?zhǔn)?。jQeury是調(diào)用方法返回自身,但是Promise是調(diào)用方法后返回一個新的Promise。
const promise = new Promise((resolve, reject) => { resolve("ok"); }) const promise$1 = promise.then(() => {console.log()}); promise$1 === promise // false
可以看到上面的promise$1是不等于promise的,如果可以在node.js 或者在瀏覽器中進行斷點調(diào)試的話,還能看到promise$1的初始化狀態(tài)是pending的。
當(dāng)Promise的實例使用then, catch, finally添加完回調(diào)方法以后,會返回一個初始化狀態(tài)為pending的Promise的實例對象。此對象的狀態(tài)我們在外部的程序是無法進行改變的,它的狀態(tài)取決于前面所注冊的回調(diào)方法的執(zhí)行情況。 當(dāng)回調(diào)方法運行正常,沒有產(chǎn)生錯誤或者異常,返回的值除Promise實例與本身(返回本身將會報錯),返回的Promise的實例對象狀態(tài)會變成resolved, 如果有錯誤或者異常,則會把狀態(tài)變?yōu)閞ejected。當(dāng)然了返回值是Promise的實例對象,那么次Promise實例對象的狀態(tài)取決于返回的Promise實例對象的狀態(tài)。
下圖以then為例展示promise鏈?zhǔn)秸{(diào)用運行的流程
示例分析const promise$0 = Promise.resolve("resolve_0"); const promise$1 = new Promise((resolve, reject) => {resolve("resolve_1")}) promise$0.then((val) => { console.log(val) }).then(() => { console.log("continue") }); promise$1.then((val) => { console.log(val) }); //輸出結(jié)果: resolve_0 resolve_1 continue
promise$0與promise$1在使用then添加回掉函數(shù)之前,狀態(tài)已經(jīng)從pending變?yōu)閞esolved,它們添加的回掉函數(shù)會被立即添加到Promise的運行隊列,promise$0.then((val) => { console.log(val) })返回的Promise實例需要等待所注冊的回調(diào)函數(shù)成功執(zhí)行完畢以后,此Promise的狀態(tài)才從pending變?yōu)閞esolved。 Promise的運行機制請參考: Promise的運行機制
const promise = Promise.resolve("ok"); promise.then().then((val) => {console.log(val)}); // ok
由于promise通過then沒有成功添加回調(diào)函數(shù),發(fā)生了值穿透。
const promise = Promise.resolve("complete"); promise.then((val) => { return new Promise ((resolve) => { resolve(val) console.log(val, 1); }) }) .then((val) => {console.log(val, 2)}) // complete 1 complete 2
我們把Promise暫命名(Pa), 通過promise.then返回的Promise(暫命名Pb), Pb狀態(tài)需要根據(jù)Pathen所注冊回調(diào)方法的運行,其回調(diào)方法返回一個新的Promise(暫命名Pc),由于返回的是Promise。Pb的狀態(tài)變成取決于Pc的狀態(tài), 當(dāng)Pc的狀態(tài)變化為resolved以后,Pb的狀態(tài)也變化為resolved。
var promise = Promise.resolve("ok"); promise.then(() => { throw new Error("error"); }).then(() => { console.log("continue"); }).then(() => { console.log("again"); }).catch(() => { }).then(() => { console.log("completed") }) // completed
在then所注冊的回調(diào)方法,發(fā)生異常以后,后續(xù)的Promise調(diào)用鏈的狀態(tài)都是rejected,導(dǎo)致后續(xù)的then(resolve)不會被推入Promise的運行隊列,也就不會被運行,直到這個錯誤被then(,reject) 或者catch捕獲。 而使用(then(,reject)) 或者catch注冊回調(diào)方法又會返回一個新的Promise,此Promise的狀態(tài)又只與它們所注冊的回調(diào)方法的執(zhí)行相關(guān)。不會受到前面的影響。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94313.html
摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁面加載發(fā)生了什么這是一篇開發(fā)的科普類文章,涉及到優(yōu)化等多個方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識之 HTTP 協(xié)議 詳細(xì)介紹 HTT...
摘要:參數(shù)如前面所提到的,方法只是方法的一個語法糖,原因就在于方法的參數(shù)為實際上是兩個回調(diào)函數(shù),分別用于處理調(diào)用它的對象的和狀態(tài),而方法就等價于狀態(tài)處理函數(shù)。對象狀態(tài)傳遞和改變的方法利用回調(diào)的返回值,可以控制某個操作后方法返回的對象及其狀態(tài)。 注意,本文主要針對ES6標(biāo)準(zhǔn)實現(xiàn)的Promise語法進行闡述,實例代碼也都使用ES6語法,快速入門ES6請參見ECMAScript 6 掃盲。 一分鐘...
摘要:事件循環(huán)從回調(diào)隊列中獲取并將其推入調(diào)用堆棧。執(zhí)行從調(diào)用堆棧中移除從調(diào)用堆棧中移除快速回顧值得注意的是,指定了事件循環(huán)應(yīng)該如何工作,這意味著在技術(shù)上它屬于引擎的職責(zé)范圍,不再僅僅扮演宿主環(huán)境的角色。 此篇是 JavaScript是如何工作的第四篇,其它三篇可以看這里: JavaScript是如何工作的:引擎,運行時和調(diào)用堆棧的概述! JavaScript是如何工作的:深入V8引擎&編寫...
摘要:忍者級別的函數(shù)操作對于什么是匿名函數(shù),這里就不做過多介紹了。我們需要知道的是,對于而言,匿名函數(shù)是一個很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎(chǔ), 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機制,如果...
摘要:回調(diào)函數(shù)模式類似于事件模型,因為異步代碼也會在后面的一個時間點才執(zhí)行如果回調(diào)過多,會陷入回調(diào)地獄基礎(chǔ)可以當(dāng)做是一個占位符,表示異步操作的執(zhí)行結(jié)果。函數(shù)可以返回一個,而不必訂閱一個事件或者向函數(shù)傳遞一個回調(diào)函數(shù)。 主要知識點:Promise生命周期、Promise基本操作、Promise鏈、響應(yīng)多個Promise以及集成PromiseshowImg(https://segmentfaul...
閱讀 2039·2023-04-25 23:30
閱讀 1459·2021-11-24 10:18
閱讀 3098·2021-10-09 09:54
閱讀 2024·2021-10-08 10:05
閱讀 3447·2021-09-23 11:21
閱讀 3170·2019-08-30 15:52
閱讀 1569·2019-08-30 13:05
閱讀 1068·2019-08-30 13:02