延迟(),promise和Promise之间的区别

我知道延迟分离承诺状态控制和处理,这里以Q为例,由Q.defer().promiseQ.Promise返回的Q.defer().promise是完全不同的,为什么这样devise呢? 这两个“承诺”有什么区别?

提前致谢

PS:我目前正在致力于一个Promise图书馆,欢迎提供证书和PRS: https : //github.com/XiaomingJS/Xiaoming.Promise

那么这是关于承诺解决scheme的来源。 Q和其他一些库提供了两个API:

  • 传统的defer API – 您在其中创build一个延迟,您可以.resolve(value) ,它有一个承诺,您可以返回。
  • 承诺构造函数 – 这是一个现代API,您可以在其中通过完成源创build承诺。

粗略地做:

 var d = Q.defer(); setTimeout(function(){ d.resolve(); }, 1000); return d.promise; 

是相同的:

 return new Promise(function(resolve, reject){ setTimeout(resolve, 1000); }); 

所以你可能会问

为什么我们需要两个API?

那么,推迟的API是第一位的。 这是其他语言如何处理它,这是文件如何处理,这是人们如何使用它 – 但是,两个API之间有一个重要的区别。 promise构造函数是安全的。

投掷安全

承诺抽象的exception处理,并保证安全。 如果你抛出一个承诺链,它会把这个exception转换成拒绝,引用规范:

如果onFulfilled或onRejected引发exceptione,promise2必须以e为拒绝原因

假设您从XHR请求中parsingJSON:

 function get(){ var d = Q.defer(); if(cached) { // use cached version user edited in localStorage d.resolve(JSON.parse(cached)); } else { // get from server myCallbackApi('/foo', function(res){ d.resolve(res); }); } } 

现在,我们来看看promise构造函数的版本:

 function get(){ return new Promise(function(resolve, reject){ if(cached) { // use cached version user edited in localStorage resolve(JSON.parse(cached)); } else { // get from server myCallbackApi('/foo', resolve); } }); } 

现在,假设您的服务器以某种方式向您发送了无效的JSON(或者用户将其编辑为无效状态)并caching起来。

在延迟版本 – 它同步抛出。 所以你一定要防范。 在底部版本中并没有。 顶级版本的用法如下所示:

 try{ return get().catch(function(e){ return handleException(e); // can also just pass as function }); } catch(e){ handleException(e); } 

在底部版本 – 承诺构造函数将转换throw到拒绝,所以它是足够的:

 return get().then(function(e){ return handleException(e); }); 

防止一整套程序员错误的发生。