Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件更合理、更强大。它最初是由社区提出并实现的,ES6将其写入语言标准,统一其用法,并在本地提供
承诺
对象。
在ES6之前,Java中的异步编程分为三类:DOM事件(比如onclick)、网络请求(比如ajax)、定时器(setTimeout/setInterval)。它们都使用回调函数进行异步调用。回调函数嵌套在回调函数中时,即使是多层回调,编码也不够直观。通过使用Promise,可以通过同步编码实现异步调用。
1.多层回调:使用setTimeout()函数执行三层嵌套异步回调,编码不直观
1函数async(){
2 setTimeout(函数(){ //回调函数1
3 console . log(1);
Settimeout(函数(){//回调函数2
5 console . log(2);
6 setTimeout(函数(){ //回调函数2
7 console . log(3);
8 },1000);
9 },1000);
10 },1000)
11 }
12
13 async();
14
15 //通话结果:1秒后打印1,2秒后打印2,3秒后打印3
2.promise:按照同步顺序编写代码,以便执行3次异步回调
使用return new Promise(),如果承诺包含异步调用(setTimeout),则在异步调用中执行resolve()之前,不会执行then函数。
1个新承诺(功能(解决、拒绝){
2 //立即执行
3 console . log(' new promise ');
4 setTimeout(() = >;{//回调函数1
5 console . log(11);//11
6决心(12);//返回值给下一个then函数
7 }, 1000);
8 }).然后(function(value){ //回调函数2
9 //在最后一次承诺解决后执行()
10 console.log(值);//12
11退回新承诺(功能(解决、拒绝){
12 setTimeout(() = >;{
13 console . log(21);//21
14决心(22);
15 }, 1000);
16 });
17 }).然后(function(value){ //回调函数3
18 //最后一次承诺解决后执行()
19 console.log(值);//22
20 setTimeout(() = >;{
21 console . log(31);//31
22 }, 1000);
23 });
24
25 //执行结果:立即打印新承诺,1s后11/12,2s后21/22,3s后31
3.如果在then的回调函数中没有声明性返回new Promise();那么return会自动返回一个新的承诺,这样那么函数就可以连锁执行了。
return自动返回的承诺中没有异步操作(setTimeout不在承诺中),所以立即执行then函数。
可以参考MDN中关于then返回值的描述:https://developer . Mozilla . org/zh-cn/docs/web/Java/reference/global _ objects/promise/then
1个新承诺(功能(解决、拒绝){
2 //立即执行
3 console . log(' new promise ');
4 setTimeout(() = >;{//回调函数1
5 console . log(11);//11
6决心(12);//返回值给下一个then函数
7 }, 1000);
8 }).然后(function(value){ //回调函数2
9 //在最后一次承诺解决后执行()
10 console.log(值);//12
11 setTimeout(() = >;{
12 console . log(21);//21
13 }, 1000);
14回22;
15 }).然后(function(value){ //回调函数3
16 //在最后一次承诺解决后执行()
17 console.log(值);//22
18 setTimeout(() = >;{
19 console . log(31);//31
20 }, 1000);
21 });
22
23 //执行结果:立即打印新承诺,1s后11/12/22,2s后21/31
4.异步编程原理:
JS是单线程的,也就是说它的执行栈是单线程的(也就是Java引擎的线程),称为主线程。JS会创建一个类似while (true)的循环,每次执行循环体的过程叫做Tick。每个Tick进程都是检查任务队列中是否有要处理的任务(DOM事件/网络请求/定时器的回调函数),如果有,则取出相关回调函数,放入执行栈,由主线程执行。
异步操作向任务队列添加相关回调。不同的异步操作在不同的时间被添加到任务队列中。onclick由浏览器内核的DOM Binding模块处理。当事件被触发时,回调函数将被立即添加到任务队列中。SetTimeout会被浏览器内核中的定时器模块延迟,时间到了会在任务队列中加入回调函数。Ajax由浏览器内核的网络模块处理,回调在网络请求返回后加入任务队列。
浏览器内核实现允许多个线程异步执行。除了Java引擎线程,还有事件触发进程、定时器触发进程、http请求线程等。它们不会与Java引擎线程相互影响,也不会导致阻塞。即Java引擎的线程被阻塞后,事件仍然会被触发,但只有事件的回调函数不能被添加到任务队列中,也不能从任务队列添加到执行堆栈中。
异步原理参考环节:https://blog.csdn.net/qdq2014/article/details/72383725/
原地址:https://www.cnblogs.com/shuqiao/p/10040885.html
工作
1.《回调函数 JS异步编程,回调函数与promise》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《回调函数 JS异步编程,回调函数与promise》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/caijing/1034220.html