ui作品集 網(wǎng)站怎么做搜素引擎優(yōu)化
如果閱讀有疑問的話,歡迎評論或私信!!
本人會很熱心的闡述自己的想法!謝謝!!!
文章目錄
- 回調(diào)中的信任問題
- 回調(diào)給我們帶來的煩惱?
- 調(diào)用過早
- 調(diào)用過晚
- 調(diào)用的次數(shù)太少或太多
- 調(diào)用回調(diào)時未能成功傳入?yún)?shù)
- 吞掉了可能出現(xiàn)的錯誤或異常
- Promise鏈?zhǔn)搅?/li>
- 探索Promise異步模式抽象的變體——Promise.all篇
回調(diào)中的信任問題
什么是信任問題?先看下面的代碼!
//這里是現(xiàn)在要進行的代碼1ajax("...",function(){//這是是將來要執(zhí)行的代碼2})//這里是現(xiàn)在要進行的代碼3
我們從1執(zhí)行到3,中間的2交給了ajax進行回調(diào),但是我們不知道ajax會什么時候調(diào)用。代碼1
之后?還是代碼3
之后?或許代碼3
的可能性更大一些,但是也不排除代碼1
的小概率事件,畢竟不是我們所能控制的。
上面中的情況我們會叫做控制反轉(zhuǎn)(inversion of control)
,總而言之,意思就是把自己代碼的控制權(quán)交給了第三方。
回調(diào)給我們帶來的煩惱?
調(diào)用過早
我們可能打算在代碼3
執(zhí)行完之后再讓代碼2
執(zhí)行。在上面的代碼中,我們可以看到,代碼2
可能在代碼3
之前運行,這種情況就屬于調(diào)用過早
。
我們通常會使用setTimeout(“…” , 0 )使這段代碼中的語句立即執(zhí)行,但是如今在ES6中,Promise幫我們已經(jīng)解決了這個問題,不再需要自行設(shè)置hack。
調(diào)用過晚
調(diào)用過晚意思是我們有時希望代碼2
可以在代碼3
之前執(zhí)行完畢,但是真實結(jié)果可能是代碼2在代碼3之后執(zhí)行的概率更大些。
這種情況我們稱之為調(diào)用過晚。
調(diào)用過早
和調(diào)用過晚
會使得我們的代碼具有二義性
,在編寫程序時,我們無法準(zhǔn)確控制
代碼執(zhí)行的時間,也無法將執(zhí)行時間提前
。但是我們可以將代碼的執(zhí)行統(tǒng)一后退
,將對代碼決議完之后的結(jié)果
統(tǒng)一執(zhí)行!Promise就是這么做的!!
回調(diào)調(diào)用過晚,導(dǎo)致未調(diào)用
這種情況也屬于調(diào)用過晚,或許因為代碼中存在javascript錯誤
,亦或者是其他錯誤
導(dǎo)致。而在ES6中的Promise,沒有任何東西
可以阻止
Promise的決議
。Promise總會調(diào)用其自身的完成回調(diào)或拒絕回調(diào)的其中一個方法。
如果Promise本身永遠不被決議呢?
Promise提供了一種成為競態(tài)
的高級抽象機制:Promise.race()
該方法的參數(shù)為一個數(shù)組,數(shù)組中可以是Promise構(gòu)造器,亦可以是立即值。在該方法中,都會通過Promise.resolve()
過濾。在數(shù)組中可以設(shè)置如下代碼設(shè)置超時,引起拒絕回調(diào)。
function timeoutPromise(delay){return new Promise(function(resolve,reject){setTimeout(function(){reject("超時了");},delay)})
})
調(diào)用的次數(shù)太少或太多
調(diào)用次數(shù)太少
是指前面的未調(diào)用
,在回調(diào)中,次數(shù)最少可以為1次。
調(diào)用次數(shù)過多
,是指回調(diào)被頻繁引用
,例如:設(shè)置的定時器過多…
在Promise中,每個決議只能被決議一次
,無論后續(xù)再怎么調(diào)用,也只能得到相同的決議值。
調(diào)用回調(diào)時未能成功傳入?yún)?shù)
要強調(diào)一句,Promise只能有一個決議值!
如果Promise沒有顯示決議,那么這個決議值是undefined,例如下面這個代碼:
var p = new Promise(function(resolve,reject){resolve();})p.then(function fulfilled(msg){console.log(msg); //undefined},function rejected(err){console.error(err);})
這里resolve
并沒有傳遞參數(shù)。
tip:如果
多個參數(shù)
調(diào)用resolve(…)或者reject(…),除了第一個參數(shù)
被傳入Promise中,其他參數(shù)會被默默忽略
。如果要傳入多個參數(shù)
,只能使用對象
或一個數(shù)組
的形式傳入。
吞掉了可能出現(xiàn)的錯誤或異常
我們先來看一下下面的代碼!
var p = new Promise(function(resolve,reject){foo.bar();resolve(1);})p.then(function fulfilled(msg){console.log(msg)},function rejected(err){console.error(err)})
在這個例子中,我們會看到控制臺打印出了下面這個錯誤:
ReferenceError: foo is not defined
at test.html:15:7
at new Promise ()
at test.html:14:14
由上所示:在出現(xiàn)javascript錯誤時,Promise會默認(rèn)調(diào)用了拒絕回調(diào)
。
我們再看一個相似的代碼:
var p = new Promise(function(resolve,reject){resolve(1);})p.then(function fulfilled(msg){foo.bar();console.log(msg)},function rejected(err){console.error(err)})
在這個例子中,我們會看到控制臺打印出了下面這個錯誤:
Uncaught (in promise) ReferenceError: foo is not defined
at fulfilled (test.html:19:7)
Uncaught
中文意思是未能捕獲
,即該異常沒有被處理
。通常我們可能會想,為什么Promise檢測到異常后不調(diào)用下面的rejected函數(shù)? 因為Promise有一個 重要原則:決議值一次決議,不會更改。我們不能因為爆出了異常,就使得該決議值成為了rejected。
解決該方法通常采用注冊處理函數(shù)的方式解決,即在尾部使用catch()。該方法相當(dāng)于以下代碼:
catch = new Promise(function(resolve,reject){reject();
})
Promise鏈?zhǔn)搅?/h2>
Promise中的鏈?zhǔn)搅?/p>
探索Promise異步模式抽象的變體——Promise.all篇
探索Promise異步模式抽象的變體