摘要:另外,需要注意多級的回調(diào)函數(shù)是交替執(zhí)行的,這正是由回調(diào)的異步性決定的??刂婆_輸出可以接收一個(gè)值或者是一個(gè)對象作為參數(shù)。但通過的方式創(chuàng)建的對象都是一個(gè)新的對象,因此后面的三個(gè)比較結(jié)果都是。
promise的立即執(zhí)行性
let p = new Promise(function(resolve, reject) { console.log("create a promise") //這時(shí)立即執(zhí)行的 resolve("success") } console.log("after new promise") p.then(function(value) { console.log(value) })
執(zhí)行結(jié)果:
"create a promise" "after new promise" "success"promise三種狀態(tài)
未完成態(tài)pending,完成態(tài)resolved,失敗態(tài)rejected
var p1 = new Promise(function(resolve,reject){ resolve(1); //同步代碼,立即被調(diào)用了,狀態(tài)為完成態(tài) }); var p2 = new Promise(function(resolve,reject){ setTimeout(function(){ resolve(2); // 異步代碼,未被執(zhí)行,狀態(tài)為未完成態(tài) }, 500); }); var p3 = new Promise(function(resolve,reject){ setTimeout(function(){ reject(3); // 異步代碼,未被執(zhí)行,狀態(tài)為未完成態(tài) }, 500); }); console.log(p1); console.log(p2); console.log(p3); setTimeout(function(){ console.log(p2); // 2,延遲執(zhí)行,此時(shí)p2和p3已被then()調(diào)用,狀態(tài)改變 }, 1000); setTimeout(function(){ console.log(p3); // 3 }, 1000); p1.then(function(value){ console.log(value); }); // 1 p2.then(function(value){ console.log(value); }); // 2 p3.catch(function(err){ console.log(err); }); // 3
執(zhí)行結(jié)果:
Promise { 1 } Promise {狀態(tài)的不可逆} Promise { } 1 2 3 Promise { 2 } Promise { 3 }
let p =new Promise(function(resolve, reject) { resolve("success") resolve("success2") reject("reject") }) p1.then(function(value) { console.log(value) })
執(zhí)行結(jié)果:
"success"
Promise的狀態(tài)一旦變?yōu)閞esolved或者rejected時(shí),狀態(tài)就固定下來了,后續(xù)的調(diào)用resolve或者reject方法都不會改變已有的狀態(tài)和值
鏈?zhǔn)秸{(diào)用let p = new Promise(function(resolve, reject) { resolve(1) }) p.then(function(value) { console.log(value) // 1 return value * 2 }).then(function(value) { console.log(value) // 2 }).then(function(value) { console.log(value) // undefined return Promise.resolve("resolve") //返回resolved狀態(tài)的promise }).then(function(value) { console.log(value) // "resolve" return Promise.reject("reject") // 返回rejected狀態(tài)的promise }).then(function(value) { console.log("resolve" + value) // 接收成功態(tài)的value }, function(err) { console.log("reject" + err) //接收失敗態(tài)的value reject reject })
執(zhí)行結(jié)果:
1 2 undefined "resolve" "reject: reject"
then方法啊返回一個(gè)新的Promise對象,函數(shù)的返回值作為then返回的Promise對象
Promise中的異常var p1 = new Promise( function(resolve,reject){ foo.bar(); resolve( 1 ); }); p1.then( function(value){ console.log("p1 then value: " + value); }, function(err){ console.log("p1 then err: " + err); // 異常捕獲 } ).then( function(value){ console.log("p1 then then value: "+value); // 之后被正確的函數(shù)調(diào)用 }, function(err){ console.log("p1 then then err: " + err); } ); var p2 = new Promise(function(resolve,reject){ resolve( 2 ); }); p2.then( function(value){ console.log("p2 then value: " + value); // 執(zhí)行 foo.bar(); }, function(err){ console.log("p2 then err: " + err); } ).then( function(value){ console.log("p2 then then value: " + value); }, function(err){ console.log("p2 then then err: " + err); // 異常捕獲 return 1; // 返回1 } ).then( function(value){ console.log("p2 then then then value: " + value); // 之后被正確函數(shù)的調(diào)用 }, function(err){ console.log("p2 then then then err: " + err); } )
執(zhí)行結(jié)果:
p1 then err: ReferenceError: foo is not defined p2 then value: 2 p1 then then value: undefined p2 then then err: ReferenceError: foo is not defined p2 then then then value: 1
異常一旦得到處理,then返回的后續(xù)Promise對象將恢復(fù)正常,并會被Promise執(zhí)行成功的回調(diào)函數(shù)處理。另外,需要注意p1、p2 多級then的回調(diào)函數(shù)是交替執(zhí)行的 ,這正是由Promise then回調(diào)的異步性決定的。
resolvevar p1 = Promise.resolve( 1 ); var p2 = Promise.resolve( p1 ); var p3 = new Promise(function(resolve, reject){ resolve(1); }); var p4 = new Promise(function(resolve, reject){ resolve(p1); }); console.log(p1 === p2); console.log(p1 === p3); console.log(p1 === p4); console.log(p3 === p4); p4.then(function(value){ console.log("p4=" + value); }); p2.then(function(value){ console.log("p2=" + value); }) p1.then(function(value){ console.log("p1=" + value); })
控制臺輸出:
true false false false p2=1 p1=1 p4=1
Promise.resolve(...)可以接收一個(gè)值或者是一個(gè)Promise對象作為參數(shù)。當(dāng)參數(shù)是普通值時(shí),它返回一個(gè)resolved狀態(tài)的Promise對象,對象的值就是這個(gè)參數(shù);當(dāng)參數(shù)是一個(gè)Promise對象時(shí),它直接返回這個(gè)Promise參數(shù)。因此,p1 === p2。但通過new的方式創(chuàng)建的Promise對象都是一個(gè)新的對象,因此后面的三個(gè)比較結(jié)果都是false。另外,為什么p4的then最先調(diào)用,但在控制臺上是最后輸出結(jié)果的呢?因?yàn)閜4的resolve中接收的參數(shù)是一個(gè)Promise對象p1,resolve會對p1”拆箱“,獲取p1的狀態(tài)和值,但這個(gè)過程是異步的
拆箱的概念應(yīng)該是micro task和macro task吧???
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/84644.html
摘要:所謂的能對狀態(tài)進(jìn)行操作的特權(quán)方法,指的就是能對對象的狀態(tài)進(jìn)行等調(diào)用的方法,而通常的的話只能在通過構(gòu)造函數(shù)傳遞的方法之內(nèi)對對象的狀態(tài)進(jìn)行操作。一般會在構(gòu)造函數(shù)中編寫邏輯,什么時(shí)候執(zhí)行回調(diào),什么時(shí)候執(zhí)行回調(diào)。 原文地址 1. 在then中使用reject 如果一個(gè)promise最初只定義了resolve,但是還想要使用reject怎么辦? 可以在then中返回一個(gè)新的promise。這個(gè)...
摘要:的翻譯文檔由的維護(hù)很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:源碼學(xué)習(xí)本篇為上一篇源碼學(xué)習(xí)的補(bǔ)充,主要是來介紹和方法。那個(gè)率先改變的實(shí)例的返回值,就傳遞給的回調(diào)函數(shù)?;窘榻B可見阮一峰老師的書籍。的狀態(tài)由決定,分成兩種情況。只有的狀態(tài)都變成,的狀態(tài)才會變成,此時(shí)的返回值組成一個(gè)數(shù)組,傳遞給的回調(diào)函數(shù)。 Promise源碼學(xué)習(xí)(2) 本篇為上一篇源碼學(xué)習(xí)(1)的補(bǔ)充,主要是來介紹Promise.all()和Promise.race()方法。閑話少敘...
摘要:下一篇大概就是源碼方面的學(xué)習(xí)筆記了龜速學(xué)習(xí)中這一次我是去看了下規(guī)范照例傳送門圖靈社區(qū)規(guī)范首先吧個(gè)人總結(jié)下該用的詞解決結(jié)婚拒絕婉拒終值值傳家寶拒因好人卡等等異常車禍理下概念我們的的就像是一場姻緣對吧解決呢就是結(jié)婚成功啦傳家寶也如愿的傳給下一代 下一篇大概就是源碼方面的學(xué)習(xí)筆記了...龜速學(xué)習(xí)中... 這一次我是去看了下Promises/A+規(guī)范照例傳送門:圖靈社區(qū)Promises/A+規(guī)...
摘要:上代碼異步執(zhí)行成功的構(gòu)造函數(shù)接收一個(gè)函數(shù)參數(shù),并傳入兩個(gè)參數(shù),分別表示異步操作執(zhí)行成功后的回調(diào)函數(shù)和異步操作執(zhí)行失敗后的回調(diào)函數(shù)。第一個(gè)回調(diào)函數(shù)是對象的狀態(tài)變?yōu)闀r(shí)調(diào)用,第二個(gè)回調(diào)函數(shù)是對象的狀態(tài)變?yōu)闀r(shí)調(diào)用。 這篇文章只解決三個(gè)問題。什么是promise? promise有什么用?promise怎么用? 1.什么是promise? 對于ES6來說,就是一個(gè)構(gòu)造函數(shù),可以用new Prom...
摘要:此時(shí),由于只有一個(gè)的狀態(tài)能夠確定,所以執(zhí)行的是唯一那個(gè)確定狀態(tài)的函數(shù),而不會執(zhí)行其他的,但是并不會阻止其他的執(zhí)行。在實(shí)際應(yīng)用中,常用來設(shè)置超時(shí)操作,比如接口請求超時(shí)等。思考這個(gè)其實(shí)并不是矛盾,接受的是返回的的狀態(tài),與原來的沒有關(guān)系。 原文地址 Promise.race // `delay`毫秒后執(zhí)行resolve function timerPromisefy(delay) { ...
閱讀 2977·2023-04-25 17:22
閱讀 1542·2019-08-30 15:54
閱讀 1270·2019-08-30 15:53
閱讀 1787·2019-08-30 15:43
閱讀 3021·2019-08-29 12:29
閱讀 1232·2019-08-26 11:37
閱讀 3255·2019-08-23 18:02
閱讀 1604·2019-08-23 14:15