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