延迟(),promise和Promise之间的区别
我知道延迟分离承诺状态控制和处理,这里以Q为例,由Q.defer().promise
和Q.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); });
防止一整套程序员错误的发生。