promise漢語是承諾的意思,就是如今尚未發生未來要發生的事,你們都知道promise能夠解決前端回調地獄的問題,能夠promise不單單是解決了上述問題。promise創建了一個可信任的回調機制,單決議性沒法取消,我認爲這纔是promise的關鍵,js無論是在瀏覽器仍是在node中運行都是單線程的,經過事件循環回調函數不可避免,對於一些第三方插件,處處是回調函數,在不實用promise的狀況下,回調函數的調用並非歸咱們掌握,而是瀏覽器,v8引擎,或者第三方插件。這樣的咱們沒法控制回調函數的調用時機,調用次數。promise創建了可信任回調單決議的基礎,把回調函數的調用權,又歸還的咱們手中,而且支持鏈式調用,寫起來很優雅。下面談兩點你們都不太熟悉的前端
1,promise的缺點node
首先:promise鏈中的錯誤很容易被忽略,例如 var p= foo(throw 'error').then(step1).then(step2);p.catch(handleError);你並不知道是那一個promise鏈產生的錯誤,若是在promise函數自己處理的錯誤,catch函數將不能處理,該錯誤會被忽略,也就是說你徹底不能獲得對已經處理過錯誤的任何通知。promise
其次:promise沒法取消,一旦建立了promise除非完成或者失敗,不然你沒法從外部取消它,這裏有一個侵入式的取消方法:瀏覽器
var ok = true;併發
var p = foo(21);async
promise.race([p,函數
timeoutPromise(3000).catch(function(err){url
ok = false;插件
throw 'err';線程
})]).then(doSomthing,handleError);
p.then(function(){
if(ok){
// what you want...
}
})
這種方式實際上是很笨蛋的。
2,生成器結合promise
這兩個最天然的組合方式是yield出來一個promise,而後經過這個promise來控制生成器的迭代器,以下:
function foo(x,y){
return request("http://someurl/?x=x,y=y");
}
function *main(){
var text = yield(11,32);
}
var it = main();
var p = it.next().value;
p.then(function(text){it.next(text)},function(err){throw 'err'});
這就是promise的生成器,也就是es7的async,await實現基礎。在使用async和await的時候注意併發事件。