延迟()之间的差异。保证和承诺延迟()之间的差异。保证和承诺(Difference between

2019-05-10 11:22发布

我知道推迟中隔离失信状态控制和过程,在这里用品质为例,通过返回的承诺Q.defer().promiseQ.Promise是完全不同的,为什么这样设计? 什么是这两个“无极”的区别

提前致谢

PS:我目前工作的一个承诺库,issuses和PRS欢迎: https://github.com/jiananshi/Promise-polyfill

Answer 1:

那么,这是关于承诺分辨率源。 Q和一堆其他图书馆提供两种API:

  • 旧版defer API -在你创建一个延迟,你可以.resolve(value) ,它有可以退货的承诺。
  • 该承诺的构造 -这是在你创建一个完成源的承诺现代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之间的重要区别。 该承诺的构造函数抛出安全。

投掷安全

承诺抽象的异常处理,并抛出安全。 如果你把一个承诺链里面它会是例外转换成拒绝,引用规范:

如果任一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); });
    }
}

现在,让我们来看看诺构造的版本:

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);
}

在底部的版本-承诺构造函数将转换throw s到拒绝,这样它就足够做:

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

从以往发生的防止全班编程错误。



文章来源: Difference between defer().promise and Promise