说到承诺,我相信每个人都经常用于日常发展。这是我们异步操作中必不可少的一部分,可以使代码看起来更好。
我已经阅读了许多有关Promise在技术界的基本原则的文章。可能的原则可能理解,这次我准备了系统的分析以实现源代码并记录下来。这对您有帮助;
有望实现库太多。下一个
让我们想象承诺中最常见的使用方式,可能是这样
第一个是新的Promise(),然后承诺必须是固定的构造函数,这是可以肯定的。
承诺功能
您会看到我们将FN和它传递给DoreLOVE执行,然后查看Doreolve;
Doreve func
您可以看到Doresolve非常简单,它直接调用我们的新承诺(FN)传递的FN,并传递了两个匿名函数以解决。拒绝被称为拒绝;
执行FN,我们的SettieMout被称为1000ms之后的Resolve(“结果”);
解决传递给FN是
在这里完成的实际上是为了防止我们多次调用解决方案。它只是第一次生效;
由于我们将分辨率异步调用,因此执行SettiMeout之后,然后将执行它。1000ms之后,决心将被调用
由于我们仅在FN中调用解决方案,因此我们将直接查看解决方案
解决功能
解决主要是检查我们的newValue的类型。我们的新价值是“结果”,自然是字符串
显然,我们示例中的分辨率类型将执行上述列表 - > 3,让我们看一下结局
结局功能
_ state是1,将执行结局代码
?嗯...延期循环弹力 - >处理func推动,并重新保留递延执行手柄func?
在当时的弹药中,我们的调用方法似乎没有区别
[去看func](#handle func)
然后是弹性
您可以看到那是Promon Prototype链上的一种方法
noopnoop是一个空的函数,其中this.constructor在这里是object.constructor;
也就是说,new Object.Constructor(函数NOOP(){});
?...迅速去控制台尝试;
嗯...实际上,我们获得了包装参数并将其分配给PROM的函数
手柄第一把手(这个新处理程序(fullfull,on Repect,prom));
新处理程序(满足,拒绝,舞会)
此功能很容易理解。新处理程序创建一个处理程序对象。这是处理程序;
处理程序下面有三个属性。fullfull,否定是诺言的传递。
然后是句柄(此处理程序)。
处理功能
如果是将其称为func的句柄函数,那么我们没有更改_state,即0,直接self._deferreds.push(延迟)。
顺便说一句,我们当时的Func的一系列电话已经完成。1000ms之后,您将调用Resolve。
如果它是从Resolve Func->大结局弹奏中调用的函数,那么_state和_value值得。在我们的示例中,_state是1,_value是'结果',它将执行
Promise._IMDIANCEFN的参数将很快执行。让我们首先看一下内容,然后详细查看此内容
根据_state判断,致电deferred.onfulfiled ||deferred.onrejectd,我们说_state有四个值。如果您忘记了,您可以回去看看。在此处执行的代码的值仅为1 ||2;
递延打电话给我们,手柄实例化对象 - > handle->推入进入;
to ret = cb(self._value);到目前为止,我们的整个新承诺(((解决,拒绝)=> {})。然后(()=> {})完成。确定调用我们的then then函数的两个函数
回到立即
嗯...啊..?Promise._ImMediateFN实际上是使用Settimeout执行的。因为即使将超时设置为0,Settimeout也会有一定的延迟,因此即使我们直接执行fn的Resolve func,订单也将晚于func。
关注 - UP将宣布答案和原则
console.log的顺序是什么?为什么?交叉点
承诺的结果是什么。
连续更新...
原始:https://juejin.cn/post/709561977882340046