JS中promise特點(diǎn)與信任問題解決
1.Promise的信任問題
1.1信任問題
所謂的信任問題就是你給出事物邏輯,將邏輯處理交給第三方解決
(即回調(diào)函數(shù)),此時會出現(xiàn)第三方給出的數(shù)據(jù)結(jié)果不是你希望的那樣。
比如重復(fù)調(diào)用,沒掉用。下次你在使用它是就會產(chǎn)生信任問題
1.2信任問題產(chǎn)生的原因
1.2.1調(diào)用過早
這個問題主要是擔(dān)心代碼是否會引入類似于Zlago這樣的副作用一種 JavaScript 開發(fā)人員虛構(gòu)的瘋狂惡魔,取名 Zalgo,**用來描述 JavaScript 中同步 / 異步的混亂**即一個任務(wù)有時異步操作,有是同步操作,可能會導(dǎo)致競態(tài)條件
Promise解決
promise即使是立刻完成,也無法被立刻調(diào)用。根據(jù)Promise特性可知道
要想看到結(jié)果必須通過==.then調(diào)用==
也就是將結(jié)果統(tǒng)一成異步操作
1.2.2調(diào)用過晚
一個同步任務(wù)鏈無法按照上面的形式運(yùn)行,即在任務(wù)鏈中,下一個任務(wù),不一定
是在上一個任務(wù)被完全調(diào)度后在運(yùn)行的。即按照預(yù)期有效的延遲另一個回調(diào)的發(fā)生
Promise解決
只要是通過then注冊的回調(diào)都會下一個異步時機(jī)點(diǎn)發(fā)生時依次被調(diào)用。
回調(diào)中的任何一個都無法影響任何一個或延遲對其他回調(diào)的運(yùn)用
eg:
p.then(function(){ p.then(function(){ console.log("c") }); console.log("A") }); p.then(function(){ console.log("B") });
輸出結(jié)果是**A,B,C**
1.2.3回調(diào)未調(diào)用
產(chǎn)生原因:回調(diào)函數(shù)有js語法錯誤等
Promise解決
可通過p.catch()獲取錯誤信息,因?yàn)榧词够卣{(diào)函數(shù)中有錯誤,回調(diào)函數(shù)還是會被調(diào)用
可通過下面的方式解決
function timeout(delay){ return new Promise(function(resolve,reject){ setTimeout(function(){ reject('Timeout!') },delay) }) } Promise.race([ foo(), timeout(3000) ]).then( function(){ //foo(...)及時完成 }, function(err){ //foo(...)被拒絕,或者沒按時完成 } )
1.2.4調(diào)用次數(shù)過少或過多
調(diào)用次數(shù)過少就是沒有調(diào)用
Promise解決
Promise只能進(jìn)行一次決議,所以任何通過then(…)注冊的回調(diào)都只會調(diào)用一次
1.2.5未傳遞參數(shù)、環(huán)境值
回調(diào)函數(shù)不知道處理那些數(shù)據(jù),以及改怎么執(zhí)行
Promise解決
如果你沒有用任何值顯式?jīng)Q議,默認(rèn)用undefined代替
#### 1.2.6吞掉錯誤和異常
回調(diào)函數(shù)出現(xiàn)錯誤和異常時在某種情況下,不向外拋出提示
2.Promise的幾個關(guān)鍵問題
2.1怎么改變Promise的狀態(tài)
通過resolve()
resolve('ok'); // pending => fulfilled (resolved)
通過reject()
reject("error"); // pending => rejected
2.2Promise 指定多個回調(diào)
一個promise對象通過多個==.then()==調(diào)用
eg:
let p = new Promise((resolve, reject) => { // resolve('OK'); }); ///指定回調(diào) - 1 p.then(value => { console.log(value); }); //指定回調(diào) - 2 p.then(value => { alert(value); });
結(jié)果是可以的
會先出現(xiàn)alert()彈框,后控制臺打印
2.3Promise 改變狀態(tài)與指定回調(diào)的順序問題
都有可能一般先指定回調(diào)后改變狀態(tài)
先改變狀態(tài)后指定回調(diào)的方法如下,也可以通過reject()或resolve()
let p = new Promise((resolve, reject) => { setTimeout(() => { resolve("OK"); }, 2000); }); p.then( (value) => { console.log(value); }, (reason) => { console.log(reason); } );
2.4Promise.then方法的返回結(jié)果特點(diǎn)
如果執(zhí)行then方法返回的是非Promise對象
新promise變?yōu)閞esolved, value為返回的值
let p = new Promise((resolve, reject) => { resolve('ok'); }); let result = p.then(value => { console.log(value); //返回結(jié)果是非 Promise 類型的對象 return 521; }); }, reason => { console.warn(reason); }); console.log(result);
如果拋出異常, 新 promise 變?yōu)?rejected, reason 為拋出的異常
如果返回的是另一個新promise, 此promise的結(jié)果就會成為新promise的結(jié)果
let p = new Promise((resolve, reject) => { resolve("ok"); }); //執(zhí)行 then 方法 let result = p.then( (value) => { console.log(value); //3. 返回結(jié)果是 Promise 對象 return new Promise((resolve, reject) => { resolve('success'); //reject('error'); }); }, (reason) => { console.warn(reason); } ); console.log(result);
2.5異常穿透
當(dāng)使用 promise 的 then 鏈?zhǔn)秸{(diào)用時, 可以在最后指定失敗的回調(diào),
前面任何操作出了異常, 都會傳到最后失敗的回調(diào)中處理
let p = new Promise((resolve, reject) => { setTimeout(() => { resolve('OK'); // reject('Err'); }, 1000); }); p.then(value => { // console.log(111); throw '失敗啦!'; }).then(value => { console.log(222); }).then(value => { console.log(333); }).catch(reason => { console.warn(reason); });
總結(jié):1.深入了解回調(diào)函數(shù)的一些問題
2.了解Promise怎么解決這些信任問題
3.了解了promise的特點(diǎn)
總結(jié)
到此這篇關(guān)于JS中promise特點(diǎn)與信任問題解決的文章就介紹到這了,更多相關(guān)JS promise信任問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript(js)處理的HTML事件、鍵盤事件、鼠標(biāo)事件簡單示例
這篇文章主要介紹了JavaScript(js)處理的HTML事件、鍵盤事件、鼠標(biāo)事件,結(jié)合實(shí)例形式分析了JavaScript針對HTML事件、鍵盤事件及鼠標(biāo)事件的簡單處理方法,需要的朋友可以參考下2019-11-11jquery對單選框,多選框,文本框等常見操作小結(jié)
本篇文章主要是對jquery對單選框,多選框,文本框等常見操作進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01JS OOP包機(jī)制,類創(chuàng)建的方法定義
JS OOP包機(jī)制,類創(chuàng)建的方法定義,需要的朋友可以參考下。2009-11-11JavaScript中遞歸實(shí)現(xiàn)的方法及其區(qū)別
遞歸函數(shù)是在通過名字調(diào)用自身的情況下構(gòu)成的。下面通過本文給大家分享JavaScript中遞歸實(shí)現(xiàn)的方法及其區(qū)別,感興趣的朋友一起看看吧2017-09-09基于JavaScript實(shí)現(xiàn)類似于百度學(xué)術(shù)高級檢索功能
這篇文章主要介紹了基于JavaScript實(shí)現(xiàn)類似于百度學(xué)術(shù)高級檢索功能 的相關(guān)資料,需要的朋友可以參考下2016-03-03動態(tài)加載dtree.js樹treeview(示例代碼)
本篇文章主要是對動態(tài)加載dtree.js樹treeview的示例代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12