对同步异步的理解(promise、async、await)大白话版本

关于同步异步

一般来说,代码就是从上执行到下,必须执行完上一句,才能执行下一句。如果上一句没有执行完,则一直在等待(阻塞),这就是同步

异步就是我不等你了,我先做自己的事。你上一句执行完了,就告诉我一声,我再干跟你相关的事。这种一般用在网络上,因为网络上状态就很多变,如果我为了拿一个数据,一直让用户等待,数据重要就还好,数据不重要这就很bug了。

回调

回调函数是什么意思呢,就是“上一句”执行完了,我回过头来执行的和这个“上一句”相关的事。这些事就是回调函数。

Promise

Promise 比回调函数厉害。因为它其实直接包括了好几个部分,“上一句”,并且为“相关的事”(回调函数)提供了便利的接口。

“上一句”也可以扩充为一个函数,比如通过网络向后台请求一个数据。那么这个函数,就有三种状态呀,正在取数据,取回数据了,取数据出错了。对应的就是,pending(中文意思是悬而未决的,其实就是正在取数据),fullfilled(完全完成了,就是取回数据了),rejected(被拒绝了,就是取数据出错了)。

知道了以上的事,那么,就开始正式的使用promise。

Promise 是一个特殊的对象,首先既然是一个对象,就一定要构造,直接用new就可以了。这个对象构造的时候传入一个函数,在上个例子里面,这个函数就是取数据。丰富一下这个例子:通过网络向后端取数据,发送完命令我就不管了,我继续逛淘宝,如果取数据成功了,那么我就开始处理数据,没成功,我就写张便利贴,说取数据没成功,为什么没成功。

var a = new Promise((resolved,rejected)=>{
	通过网络向后端取数据;
	如果没出错:
	resolved(数据);
	如果出错了的话:
	rejected(错误的原因);
}).then((数据)=>{
	开始处理数据;
}).catch((错误的原因)=>{
	写张便利贴,说取数据没成功,为什么没成功})

a();//执行向后端取数据这个函数
逛淘宝;

如上面的代码所示,以下是一些注意的地方:

1.不止promise的构造方法中传入的是一个函数。then和catch也是传入一个函数。

2.实际上这是分了三个方法,那么这三个方法之间的变量互传就是用的第一个函数(promise的构造函数)的传入变量,resolved和rejected来传递的。

异步函数

Promise肯定是一个异步函数,有回调函数的也是一个异步函数。一般网络方面的api也是异步函数

事实上,你可以随意构造一个函数,只要这个函数的返回值是一个promise,那么这就是一个异步函数。
当一个函数的返回值是promise的时候,就只能用then,catch来使用这个返回值。

async和await

首先async是一个关键字,如同static 一样的用法,表示一个函数是一个异步函数。那么这个有什么不同的呢。使用async关键字修饰的函数,可以用return xx;但是,实际上这是返回了一个promise,只是是一个简单的promise,这个promise中构造函数为空,只有一个resolved(xx)。

想要取得这个xx,那么就可以直接用await关键字,await 后面跟一个用async修饰的函数,表示我取出这个xx ,赋给等式前面这个变量res。

var res = await 异步函数(); 
逛淘宝;

这其实就是强行把异步函数变成了同步函数。必须完成赋值这一步,才能逛淘宝。

那么,异步函数不一定能正确执行,所以这里一般用try catch包裹起来。

注意咯,await必须在异步函数中才有效果。

(有理解错误,请指出,一起讨论,一起进步呀)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值