深刻了解promise

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的時候注意併發事件。

相關文章
相關標籤/搜索