好吧,这是关于承诺解决方案源的。Q和其他许多库提供两个API:
- 旧版
defer
API-您可以在其中创建一个递延函数,.resolve(value)
并承诺可以返回。 - Promise构造函数 -这是现代API,您可以在其中从完成源创建Promise。
粗略地做:
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构造函数很安全。
承诺抽象异常处理,并且是安全的。如果将一个promise链放入其中,它将引用该规范将该异常转换为拒绝。
如果onFulfilled或onRejected抛出异常e,则必须以e为理由拒绝promise2
假设您正在从XHR请求中解析JSON:
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); }); }}
function get(){ return new Promise(function(resolve, reject){ if(cached) { // use cached version user edited in localStorage resolve(JSON.parse(cached)); } else { // get from servermyCallbackApi('/foo', resolve); } });}
现在,假设服务器以某种方式向您发送了无效的JSON(或用户将其编辑为无效状态)并进行了缓存。
在延迟版本中-它是同步抛出的。因此,您通常必须谨防。在底部版本中则没有。最高版本的用法如下所示:
try{ return get().catch(function(e){ return handleException(e); // can also just pass as function });} catch(e){ handleException(e);}
在底部版本中-promise构造函数会将
throws 转换为拒绝,因此足以执行此 *** 作:
return get().then(function(e){ return handleException(e);});
防止发生一整类程序员错误。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)