深入了解promise

promise汉语是承诺的意思,就是现在还没有发生将来要发生的事,大家都知道promise可以解决前端回调地狱的问题,可以promise不仅仅是解决了上述问题。promise建立了一个可信任的回调机制,单决议性无法取消,我认为这才是promise的关键,js不管是在浏览器还是在node中运行都是单线程的,通过事件循环回调函数不可避免,对于一些第三方插件,到处是回调函数,在不实用promise的情况下,回调函数的调用并不是归我们掌握,而是浏览器,v8引擎,或者第三方插件。这样的我们无法控制回调函数的调用时机,调用次数。promise建立了可信任回调单决议的基础,把回调函数的调用权,又归还的我们手中,并且支持链式调用,写起来很优雅。下面谈两点大家都不太熟悉的

1,promise的缺点

首先:promise链中的错误很容易被忽略,例如 var  p= foo(throw 'error').then(step1).then(step2);p.catch(handleError);你并不知道是那一个promise链产生的错误,如果在promise函数本身处理的错误,catch函数将不能处理,该错误会被忽略,也就是说你完全不能得到对已经处理过错误的任何通知。

其次:promise无法取消,一旦创建了promise除非完成或者失败,否则你无法从外部取消它,这里有一个侵入式的取消方法:

var ok = true;

var p = foo(21);

promise.race([p,

timeoutPromise(3000).catch(function(err){

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的时候注意并发事件。

 

posted @ 2018-12-27 14:29  node-吉利  阅读(430)  评论(0编辑  收藏  举报