为什么需要异步?
因为js是单线程的,js在一段时间之内只能做一件事。
什么是异步?
在说异步之前,先说一下什么是同步。
同步:一定要等任务执行完了,得到结果,才执行下一个任务。
异步:不等任务执行完,直接执行下一个任务。
去网上可以搜索PromiseA+规范;
Promise是内置的构造函数,用来管理回调Promise函数的(想象成回调函数的状态机);
使用new Promise()来创建一个Promise对象,需要注意的是Promise有三个状态:pending、resolved成功、rejected失败;
new Promise()括号里面必须传一个函数,并且它会立即执行,执行的同时会传2个参数,一个是resolved,另一个是rejected;
关于成功和失败两个参数的使用
1 | const p = new Promise((resolved,rejected)=>{ |
注意:pending状态只能变成成功或者pending状态只能变成失败这两种状态的转变;不能成功变成pending或者失败变成pending或者成功和失败之间各自相互转换。
then()方法相当于注册事件。
如:
1 | const p = new Promise((resolved,rejected)=>{ // p在这里相当于是一个占位符 |
可以把Promise想象成占位符(对未来值进行操作)。
创建一个已处理的Promise对象。
如:
1 | const p1 = Promise.resolve(); |
其实就是一个链式调用Promise引起的问题。由于它们会返回一个新的Promise对象,因此可以进行链式调用。
下面给大家举一个例子,如下所示:
1 | const p = new Promise((resolved,rejected)=>{ |
Promise.all();
Promise.all()会返回一个新的Promise,因此我们就可以调用then()方法。
如:
1 | function fakeAjax(ms,val){ |
Promise.race()它会去响应最快的那个请求,不管这个请求是成功了还是失败了。
catch()方法
catch()方法相当于是失败的回调函数,等价于then(null,function(){});