之前学ES6的时候,总感觉Promise的概念很难,学的迷迷糊糊。但axios使用Promise封装了ajax,所以必须对promise很熟悉。 此外,在面试中,es6中,内置对象已经添加Promise(控制抽象对象),Promise也是必问的。以下从Promise的定义,api,关键问题。到Promise面试题。到手写Promise。
0 补充知识
0.1 实例对象和函数对象
0.2 回调函数的两种类型
0.3 JS的err处理
1 Promise理解和使用
1.1 Promise是什么?
1 抽象表达:Promise就是新的异步编程(旧的是纯回调形式)
2 具体表达: 语法:Promise就是一个构造函数。 功能:Promise对象用来封装异步操作,并且可以其获取结果。
1.2 为什么使用Promise?
1 旧:回调方式不灵活。回调函数,必须在异步任务之前指定。 promise:启动异步任务=》返回promise对象=》给promise对象绑定回调。
2 旧:会引发回调地狱。 promise:使用链式调用。
1.3 如何使用Promise?
a. Promise()
promise:构造器。主要用于包装不支持promise(返回值不是Promise)的函数。
语法:new Promise (executor)。
1个双参函数:executor
2个参数:resolve,reject。
3个状态: executor函数里面,一般有异步函数,resolve(参数1:someValue)函数和reject(参数2:failure reason)函数。 调用reslove函数会使状态从pedding变成 resolved,并且返回一个值代表成功。调用reject函数会使状态pedding变成rejected,并且返回失败原因。(如果是抛出异常,promise会变成rejected,executor的返回值也会被忽略)
4接收,一般是使用const p1。或者函数里面 return。 或者Promise.链式调用。
5代码:
const p1 = /return new Promise( //1个构造器:executor
//2个参数:
(reslove,reject)=>{ setTimeout({
if(a){ reslove(); //3状态改变
}esle{reject();
}
},1000)
})
b.Promise.prototype.then()
then()方法是返回一个Promise。最多有两个参数:Promise成功的情况的回调(回调函数名称:onResolved())和失败时候的回调(onRejected)。
1如果是提供非函数参数,那么then方法会丢失该状态的回调函数信息,但是并不会产生错误。
2如果调用 then 的 Promise 的状态(fulfillment 或 rejection)发生改变,但是 then 中并没有关于这种状态的回调函数,那么 then 将创建一个没有经过回调函数处理的新 Promise 对象,这个新 Promise 只是简单地接受调用这个 then 的原 Promise 的终态作为它的终态。
语法: 1参数: p.then(onFuliled[,onRejected]) ,p.then(value=>{}, reason=>{})。//onFulied 可选,fulfilled时候,调用参数。如果参数不是函数,内部替换x=>x;
2返回值:
当一个 [Promise] 完成(fulfilled)或者失败(rejected)时,返回函数将被异步调用(由当前的线程循环来调度完成)。具体的返回值依据以下规则返回。如果 then 中的回调函数:
1返回值: 2没有返回值: 3抛出错误。
4返回一个是接受状态的Promise 5返回一个是 6返回一个未定状态的
c.Promise.prototype.catch()
.catch:(onRejected) =>{} onRejected函数:失败函数的回调{reason}=>{} 此函数是.then的语法糖。then(undefined,onRejected)
d.Promise.prototype.finally()
e.Promise.reject() Promise.reject(3);
f.Promise.resolve() Promise.resolve(2); Promise.( (resolve,reject)=>{ resolve(2)};
g.Promise.all([p1,p2,p3]):返回Promise pAll.then( values =>{ values},[1,2]//成功返回成功的数组,按照顺序的,并不是按照异步结果 reason=>{reason} //失败返回失败的数组,按照顺序的,并不是按照异步结果 )
h.Promise.race([p1,p2,p3]): 返回Promise。取第一名的结果。 如果是同步的,返回第一个。如果是异步的,返回最先的。
1.4关键性的问题
1如何改变Promise的状态? Promise( resolve(1), //resolved reject(1), //rejected throw new Error()。throw 3//rejectd 。(js内部一次) ) p.then(value=>{},reason=>{consloe.log(reason)}
2.一个Promise指定多个成功或者失败的回调函数,都会调用嘛? p.then(reason=>{console.log(1}) p.then(reason=>{console.log(2}) 当Promise改成为对于的状态都会调用。
3.改变Promise状态和指定回调函数谁先谁后?
- Promise.then()返回的新的Promise的状态又谁决定。
【.then返回的promise由回调函数结果指定】
答案:1先回答一句话,then()指定的回调函数执行的结果决定。
2详细表达:
a.抛出异常,新的promise变为rejected,reason为抛出的异常
b.返回Promise的任意值,新的promise是resolved,value是返回的结果。 c.返回另一个新的Promise,此promise变成新promise的结果。
a.返回的是非Promise,则看return。没有return就是0. b. 返回的是Promise,则看Promise的状态。
5.Promise如何串联多个任务操作。 除了第一个,剩下函数的只能是return返回(throw的话是不返回的,是erro)
2.同步的返回: 看return。 没有return
1.promise异步的返回: 看resolve(1)() reject。 throw。 有resolve:不返回。 同步里面的嵌套异步: 先return 在看return的是同步还是异步。 同步:2。 异步:new Promise。 没有return:那么就是什么都不返回。
2.then返回你失败,1 throw 异常。2 return newPromise(rej) 6.Promise异常传递?穿透。4:33 1.当使用promisethen链式调用,可以在最后指定失败的回调。 2 前面任何操作出了异常,都会传到失败的回调中处理。
7.中断Promise链? 1 promisethen链式调用,中间中断,不在调用后面的回调函数。 2 方法,在函数中返回一个pendding状态的promise对象。 return new Promise(()=>{})//返回一个pending的promise。