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