1.promise前言
1.什么是js的同步和异步?
答:js是单线程的 ====》一条流水线
同步异步的差别在于这条流水线上各个流程的执行顺序不同;
同步:按照主线程中程序排队的顺序,来一个个执行, 前一个执行完才会执行后一个;
异步:主线程中的某些程序任务,可先不执行放在队列中,而去执行下个任务;
如:定时器可放在队列中,等后面执行好后,再回头去执行;
简单理解为:改变程序正常执行顺序的操作就为异步操作;
2.常见的异步执行有:定时器、ajax请求等;
异步不是js同时做两件事情,js是单线程的:
只是一个任务未结束,先不执行,而去执行下一个内容;
ajax请求可以与js代码同时进行,因为ajax请求不由js引擎负责,而由浏览器模块负责;
3.为什么要用异步?
因为若在执行中有定时器或ajax请求等任务,若不用异步,
则它执行完需要等一定的时间,才能继续执行后面内容;会卡在页面上,很不友好。
4.如何实现异步?
回调函数、promise对象、生成器等。。。。。
(回调函数包括了定时器和ajax请求)
2.promise对象介绍
1.promise是什么?
promise是一种异步编程模式;(是一种写代码的方式)
Promise是一个构造函数,用来生成promise实例
2.promise的作用?
promise可以实现异步执行;
有了Promise对象,可以将异步操作以同步的流程表达出来,使代码看起来清晰,直观。
避免了传统回调函数中层层嵌套的回调函数(俗称'回调地狱');
3.如何使用promise的介绍:
promise对象的3个状态
*pending:初始化状态
*fullfilled:成功状态
*rejected:失败状态
4.使用promise基本步骤(2步):
(1)创建promise对象p ,
传进来一个函数作为参数,函数中也传两个参数
let p=new Promise((resolve,reject)=>{
//初始化实例p状态为pending;
//执行异步操作
if(、、、条件、、){
resolve(value); //修改实例p的状态为fullfilled
} //value为传值
else{
reject(errMsg); //修改实例p的转态为rejected
} //errMsg为传值
})
(2).调用p的then()
then中传两个回到函数作为参数
p.then(()=>{
.... //若p执行了resolve(),状态为fullfilled,则执行这里代码
},()=>{
.... //若p执行了reject(),状态为rejected,则执行这里代码
})
5.解释代码:
*创建promise对象p中:
1.构造函数接受一个函数作为参数
2.调用构造函数的到实例p的同时,作为参数的函数会立即执行
3.参数函数接受两个回调函数作为参数resolve和reject
4.在参数函数被执行的过程中,
如果在其内部调用resolve,会将p的状态变成fullfilled,
或者调用reject,会将p的状态变成rejected;
*调用promise的then()
1.调用.then可以为实例p注册两种状态回调函数
2.当实例p的状态为fullfilled,会触发第一个函数执行,
3.当实例p的状态为rejected,会触发第二个函数执行;
.then用于为promise对象的状态注册回调函数。
它会返回一个promise对象,所以可以进行链式调用也就是.then后面可以继续.then。
在注册的状态回调函数中, 可以通过return语句改变.then返回的promise对象的状态,
以及向后面.then注册的状态回调传递数据;也可以不使用return语句,
那样默认就是将返回的promise对象resolve。
.catch用于注册rejected状态的回调函数,同时该回调也是程序出错的回调,
即如果前面的程序运行过程中出错,也会进入执行该回调函数。
同.then一样,也会返回新的promise对象。