JS中promise特點與信任問題解決
1.Promise的信任問題
1.1信任問題
所謂的信任問題就是你給出事物邏輯,將邏輯處理交給第三方解決
(即回調函數),此時會出現第三方給出的數據結果不是你希望的那樣。
比如重復調用,沒掉用。下次你在使用它是就會產生信任問題
1.2信任問題產生的原因
1.2.1調用過早
這個問題主要是擔心代碼是否會引入類似於Zlago這樣的副作用一種 JavaScript 開發人員虛構的瘋狂惡魔,取名 Zalgo,**用來描述 JavaScript 中同步 / 異步的混亂**即一個任務有時異步操作,有是同步操作,可能會導致競態條件
Promise解決
promise即使是立刻完成,也無法被立刻調用。根據Promise特性可知道
要想看到結果必須通過==.then調用==
也就是將結果統一成異步操作
1.2.2調用過晚
一個同步任務鏈無法按照上面的形式運行,即在任務鏈中,下一個任務,不一定
是在上一個任務被完全調度後在運行的。即按照預期有效的延遲另一個回調的發生
Promise解決
隻要是通過then註冊的回調都會下一個異步時機點發生時依次被調用。
回調中的任何一個都無法影響任何一個或延遲對其他回調的運用
eg:
p.then(function(){ p.then(function(){ console.log("c") }); console.log("A") }); p.then(function(){ console.log("B") });
輸出結果是**A,B,C**
1.2.3回調未調用
產生原因:回調函數有js語法錯誤等
Promise解決
可通過p.catch()獲取錯誤信息,因為即使回調函數中有錯誤,回調函數還是會被調用
可通過下面的方式解決
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調用次數過少或過多
調用次數過少就是沒有調用
Promise解決
Promise隻能進行一次決議,所以任何通過then(…)註冊的回調都隻會調用一次
1.2.5未傳遞參數、環境值
回調函數不知道處理那些數據,以及改怎麼執行
Promise解決
如果你沒有用任何值顯式決議,默認用undefined代替
#### 1.2.6吞掉錯誤和異常
回調函數出現錯誤和異常時在某種情況下,不向外拋出提示
2.Promise的幾個關鍵問題
2.1怎麼改變Promise的狀態
通過resolve()
resolve('ok'); // pending => fulfilled (resolved)
通過reject()
reject("error"); // pending => rejected
2.2Promise 指定多個回調
一個promise對象通過多個==.then()==調用
eg:
let p = new Promise((resolve, reject) => { // resolve('OK'); }); ///指定回調 - 1 p.then(value => { console.log(value); }); //指定回調 - 2 p.then(value => { alert(value); });
結果是可以的
會先出現alert()彈框,後控制臺打印
2.3Promise 改變狀態與指定回調的順序問題
都有可能一般先指定回調後改變狀態
先改變狀態後指定回調的方法如下,也可以通過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方法的返回結果特點
如果執行then方法返回的是非Promise對象
新promise變為resolved, value為返回的值
let p = new Promise((resolve, reject) => { resolve('ok'); }); let result = p.then(value => { console.log(value); //返回結果是非 Promise 類型的對象 return 521; }); }, reason => { console.warn(reason); }); console.log(result);
如果拋出異常, 新 promise 變為 rejected, reason 為拋出的異常
如果返回的是另一個新promise, 此promise的結果就會成為新promise的結果
let p = new Promise((resolve, reject) => { resolve("ok"); }); //執行 then 方法 let result = p.then( (value) => { console.log(value); //3. 返回結果是 Promise 對象 return new Promise((resolve, reject) => { resolve('success'); //reject('error'); }); }, (reason) => { console.warn(reason); } ); console.log(result);
2.5異常穿透
當使用 promise 的 then 鏈式調用時, 可以在最後指定失敗的回調,
前面任何操作出瞭異常, 都會傳到最後失敗的回調中處理
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); });
總結:1.深入瞭解回調函數的一些問題
2.瞭解Promise怎麼解決這些信任問題
3.瞭解瞭promise的特點
總結
到此這篇關於JS中promise特點與信任問題解決的文章就介紹到這瞭,更多相關JS promise信任問題內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- ES6的Promise用法詳解
- JS異步編程Promise對象詳解
- JavaScript中的Promise詳解
- 前端JavaScript之Promise
- JS Promise axios 請求結果後面的.then() 是什麼意思