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

 

转载于:https://www.cnblogs.com/node-jili/p/10184800.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值