猿问

defer()。promise和Promise之间的区别

defer()。promise和Promise之间的区别

我知道推迟分离承诺状态控制和处理,这里使用Q作为例子,承诺返回的承诺Q.defer().promiseQ.Promise完全不同,为什么设计这样?这两个“承诺”有什么区别

提前致谢

PS:我目前正在开发Promise库,欢迎使用issws和PRS:https//github.com/jiananshi/Promise-polyfill


千万里不及你
浏览 1034回答 1
1回答

森林海

嗯,这是关于承诺解决方案的来源。Q和一堆其他库提供了两个API:遗留deferAPI - 您可以在其中创建延期,.resolve(value) 并且它具有您可以返回的承诺。promise构造函数 - 这是一个现代API,您可以在其中从完成源创建承诺。粗略地做: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构造函数是安全的。投掷安全承诺抽象异常处理并保持安全。如果你扔进一个承诺链,它会将该异常转换为拒绝,引用规范:如果onFulfilled或onRejected引发异常e,则必须拒绝promise2,并将e作为原因假设您正在从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); });     }}现在,让我们看看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(或者用户将其编辑为无效状态)并缓存了它。在延迟版本中 - 它会同步抛出。所以你必须一般防范它。在底部版本它没有。最高版本的用法如下: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);});防止一整类程序员错误发生。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答