javascript – 为什么Promise构造函数需要执行程序?

前端之家收集整理的这篇文章主要介绍了javascript – 为什么Promise构造函数需要执行程序?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用 Promises时,为什么不能在代码库的其他地方定义解析和拒绝的触发器?

我不明白为什么解决和拒绝逻辑应该在声明promise的地方进行本地化.这是疏忽,还是强制执行者参数是否有好处?

我相信执行程序函数应该是可选的,并且它的存在应该确定promise是否封装了解决方案.如果没有这样的要求,承诺将更加可扩展,因为您不必立即启动异步.承诺也应该是可以重置的.它是1个开关,1或0,re​​solve()或reject().可以附加多种并行和顺序结果:promise.then(parallel1)和promise.then(parallel2)以及promise.then(seq1).then(seq2)但参考特权玩家无法解析/拒绝INTO开关

您可以在以后构建结果树,但不能改变它们,也不能改变根(输入触发器)

老实说,连续结果的树也应该是可编辑的.假设你想要拼出一个步骤并在你宣布许多承诺链之后做其他事情.重建承诺和每个顺序功能是没有意义的,特别是因为你甚至不能拒绝或毁掉承诺……

解决方法

这被称为Domenic创造的 the revealing constructor pattern.

基本上,这个想法是让你在对象尚未完全构建的同时访问对象的某些部分.引用Domenic:

I call this the revealing constructor pattern because the Promise constructor is revealing its internal capabilities,but only to the code that constructs the promise in question. The ability to resolve or reject the promise is only revealed to the constructing code,and is crucially not revealed to anyone using the promise. So if we hand off p to another consumer,say

过去

最初,promises使用延迟对象,这在JavaScript承诺的扭曲承诺中也是如此.在Angular的$q,Q,jQuery和旧版本的bluebird之类的旧实现中,这仍然是正确的(但经常被弃用).

API类似于:

var d = Deferred();
d.resolve(); 
d.reject();
d.promise; // the actual promise

它工作,但它有一个问题. Deferreds和promise构造函数通常用于将非承诺API转换为promise. JavaScript中存在一个名为Zalgo的“着名”问题 – 基本上,它意味着API必须是同步的或异步的,但不能同时进行.

事情是 – 延迟可以做以下事情:

function request(param) {
   var d = Deferred();
   var options = JSON.parse(param);
   d.ajax(function(err,value) { 
      if(err) d.reject(err);
      else d.resolve(value);
   });
}

这里有一个隐藏的微妙错误 – 如果param不是一个有效的JSON,这个函数会同步抛出,这意味着我必须在} catch(e){和.catch(e => catch)中包装每个promise返回函数所有的错误.

promise构造函数捕获此类异常并将其转换为拒绝,这意味着您永远不必担心同步异常与使用promises的异步异常. (它通过在下一个勾号中执行“然后回调”来保护你的另一面).

此外,它还需要一个额外的类型,每个开发人员必须了解promise构造函数不在哪里,这是非常好的.

猜你在找的JavaScript相关文章