手机版

对js承诺链的深刻理解

时间:2021-11-01 来源:互联网 编辑:宝哥软件园 浏览:

新标准增加了原生承诺。

在这里,我们只讨论链的使用,并思考细节。

1、关于接着()和赶()的复习。

回调函数可以放在then()和catch()的参数中,以接收Promise的最终结果。

然后()可以接收一个参数,所以只有当Promise resolve()时才会调用这个回调。

那么()也可以接收第二个参数,所以第二个回调用来处理Promise reject()的情况。

Catch()专门处理承诺拒绝()的情况。

也就是说,那么()可以并发使用,而catch()只能处理reject()。但是,建议使用then()来处理resolve(),使用catch()来处理reject()。

第二,不过,我不想谈以上的事情,只是回顾一下基本用法。让我们从then()和catch()的返回值和链用法的细节开始。

然后官方文件说Then()和catch()都返回一个Promise,很耐人寻味。我是js的新人,之前没碰过承诺。

首先,这个新返回的承诺不是原来的承诺;

第二,这个新返回的Promise的状态变化(是resolve();或者拒绝()。)先前承诺的状态与当时()的使用方式有关。

然后()先解释:(catch类似)。

var p1=承诺.解决(“成功”);var p2=P1 . then(task 1);var P3=p2 . then(task 2);注意:上面的task1和task2是回调。

这里,p1是创建的Promise,直接解析();

P2是由当时获得的承诺(),p3也是由当时获得的承诺()。

那么p2的状态如何变化,p3呢?

我将用下图来解释这个概念:

其中,

1.八边形代表承诺对象。

2.圆圈代表承诺的内部状态,黑色箭头代表状态变化。

3.右边的箭头表示调用then函数。

4.也就是说,只要调用了then函数,就会生成一个新的Promise对象。

5.调用then函数时,不知道之前的Promise对象是什么状态,是挂起还是置位?这个不能假设,外面也看不到。

6.然后函数的调用没有被阻塞,也就是说,p2和p3几乎是瞬间生成的,即使p1仍然在缓慢地迁移它自己的状态。

我们知道p1的状态是解析的(参见上面的代码)。然而,这里不清楚p2和p3的状态如何变化,是解决还是拒绝?看下面这张新照片。

你可以看到更多的钻石。

菱形表示调用时传入的回调函数。向上的菱形表示[解决最后一个承诺对象]的传入处理,向下的菱形表示[拒绝最后一个承诺对象]的传入处理。

注:本例中没有介绍剔除的处理,也就是说上图中不应该画向下的菱形,但为了方便,只知道向上和向下的菱形关系到如何使用然后或者接住。再次查看示例代码:

var p1=承诺.解决(“成功”);var p2=P1 . then(task 1);//产生一个向上的菱形var p3=p2 .然后(task 2);//从向上的菱形可以看出,我们没有给出当时的第二个参数,也就是没有处理剔除。

另外,如果要处理剔除,可以用then或者catch,专门用来处理剔除,否则和then没什么区别。

1.如果p1的最终状态(resolve或reject)处理正确(当调用then时,相应的回调被传入,即有相应的菱形),那么p2的状态将转为resolve。

2.如果p1的最终状态(解析或拒绝)没有被正确处理(当调用then时,没有相应的回调,即没有相应的菱形),那么p1的状态将被路由到p2(接收p1的状态)。

3.像这样传递下去。

4.本文不解释如何在回调中获取最后一个Promise的最终数据,即如何传递数据。有很多教程。

第三,下面给出一些例子来总结本文。

在图中,给出了P1的状态,它自己给出了解决或拒绝。目的是推断P2和P3的最终状态。

这是四个独立的例子,它们之间没有联系。

x表示P3不使用then或catch函数,因此无法处理resolve或reject。

最后,如有错误,请及时改正。谢谢大家!~!@~~~

以上对js无极链的深入了解是边肖分享的全部内容,希望能给大家一个参考和支持。

版权声明:对js承诺链的深刻理解是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。