当前位置: 首页 > 面试题库 >

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

梁骞仕
2023-03-14
问题内容

使用Promises时,为什么不能在代码库的其他地方触发resolvereject定义?

我不明白为什么resolvereject应该在声明诺言的地方本地化逻辑。这是疏忽大意,还是强制执行此executor参数有好处吗?

我相信执行程序功能应该是可选的,并且它的存在应该确定promise是否封装了解决方案。没有这样的授权,promise的可扩展性就更大,因为您不必立即启动异步。承诺也应该是可重置的。这是1档开关,1或0
resolve()reject()。可以附加许多平行和顺序的结果:promise.then(parallel1)而且promise.then(parallel2),具有promise.then(seq1).then(seq2)参考特权的参与者也无法解决/拒绝进入这一转变

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

老实说,顺序结果树也应该是可编辑的..说您想在声明了许多许诺链之后拼接一个步骤,然后执行其他操作。重建诺言和每个顺序函数是没有意义的,尤其是因为您甚至不能拒绝或破坏诺言。


问题答案:

这称为Domenic创造的揭示构造器模式。

基本上,这个想法是让您访问尚未完全构造的对象的 各个部分 。报价Domenic:

我之所以称其为揭示性构造函数模式,是因为Promise构造函数正在揭示其内部功能,但仅揭示了构造有问题的promise的代码。解决或拒绝诺言的能力只会显示给构建代码,而至关重要的是不会透露给使用诺言的任何人。因此,如果我们将p交给另一个消费者,说

过去

最初,promise与延迟对象一起使用,在源自JavaScript的Promise的Twistedpromises中是正确的。在较旧的实现中(例如Angular $q,Q,jQuery和bluebird的旧版本),这仍然是正确的(但通常已弃用)。

API类似于:

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

它有效,但是有问题。Deferreds和Promise构造函数通常用于将非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,则此函数 同步 引发,这意味着我必须将每个promise返回函数都包装在a} catch (e) {和a中,.catch(e =>以捕获所有错误。

promise构造函数捕获此类异常并将其转换为拒绝,这意味着您不必担心同步异常与带有Promise的异步异常。(它通过始终then在“下一个刻度”中执行回调来从另一方面保护您)。

此外,它还需要每个开发人员都必须了解一种额外的类型,以了解promise构造函数不擅长的地方。



 类似资料:
  • 问题内容: 必须使用无参数构造函数(像Hibernate这样的工具会在此构造函数上使用反射来实例化对象)。 我得到了这个手挥手的答案,但是有人可以进一步解释吗?谢谢 问题答案: hibernate,并且通常通过反射创建对象的代码用于创建类的新实例。此方法需要一个公共的无参数构造函数才能实例化该对象。对于大多数用例,提供无参数构造函数不是问题。 有一些基于序列化的技巧可以解决没有no-arg构造函数

  • 问题内容: 我对此代码有疑问:https : //github.com/reactjs/redux/blob/master/examples/async/containers/App.js 特别: 我猜这是一个两部分的问题。 为什么我需要将句柄更改设置为类的实例,我不能只对handleChange使用静态函数并直接在类中调用它 ? 我不知道这是怎么回事: 谢谢 问题答案: 以相反的顺序回答… 返回

  • 问题内容: 这有任何重要目的吗?可以省略吗? 问题答案: 并非总是必要的,但是它确实有其用途。假设我们想在基类上创建一个复制方法。像这样: 现在,当我们创建一个新的并复制它时会发生什么? 该副本不是的实例。这是因为(没有显式检查),我们无法从“基本”类返回副本。我们只能返回。但是,如果我们重置了构造函数: …然后一切都按预期进行:

  • 问题内容: Animal animal = new Animal(101); //Constructor is executed. 问题答案: 类中给定方法的默认实现不调用任何构造函数。 它创建对象的“浅表副本”,因为它通过创建新实例然后通过分配复制内容来创建对象的副本,这意味着 如果您的Class包含可变字段,则原始对象和克隆都将引用同一内部对象 。 尝试看看此页面。

  • 问题内容: 如果您尝试封送引用了没有no-arg构造函数的复杂类型的类,例如: 与Java一起的JAXB实现,如下所示: JAXB会抛出一个 现在,我了解了为什么JAXB在解组时需要no-arg构造函数-因为它需要实例化该对象。但是为什么JAXB在编组时需要no-arg构造函数? 另外,还有一个问题,为什么Java的JAXB实现会在字段为null时抛出异常,并且无论如何都不会将其编组? 我是否缺少

  • 我目前正在学习Java的继承,我在理解它方面遇到了很大的困难,但是我不能理解的一个主要问题是为什么在下面的示例中有必要调用一个超类构造函数,它有什么帮助?此示例来自Oracle的方法教程。 我最初的想法是,会缩短当前构造函数中参数的代码,它只会接受父类中传入的值并将其添加到子类中(如下所示): 但是,正如我已经知道的那样,这是错误的,并且再次将我带到了真正做什么的问题上。我会非常感谢一些形式的解释