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

相关文章
相关标签/搜索