1.如何改变promise的状态
1). resolve(value) 如果当前的状态是pedding 就会改为 resolved
2). reject(reason) 如果当前状态是pedding 就会改为 rejected
2.一个promise指定多个成功 / 失败的回调,都会调用吗?
当promise状态改变时,对应的回调函数都会调用
const p = new Promise((resolve,reject)=>{ resolve(1) }) p.then( value=>{ console.log(value) // 1 }, reason=>{ console.log(reason) } ) p.then( value=>{ console.log('value2:' + value) // value2:1 }, reason=>{ console.log('reason2' + reason) } )
3.改变promise的状态和指定回调函数,谁先谁后?
1). 都有可能,正常情况下时先指定回调函数再改变状态,但也可以先改变状态,再指定回调。
2). 如何先改变状态,再指定回调函数
在执行器中直接调用resolve() / reject()
再延迟更长的时间才调用then
3). 什么时候才能得到数据
如果先指定回调函数,当状态改变的时候,回调函数就会被执行,得到数据
如果先改变状态,那当指定回调时,就会调用回调函数,得到数据
4. promise.then()返回的新的promise的状态由谁决定?
1). 简单表达:由then()指定的回调函数的执行结果来决定
2). 详细表达:
如果回调函数抛出异常,新的promise变为reject,reason为异常的原因
如果返回的为非promise的任意值,则状态为resolved value为其返回值
如果返回的为一个新的promise,状态为新的promise的结果
5. promise如何串联多个异步操作任务?
1). promise的then()返回一个新的promise,可以写成then(). 的链式调用
2). 通过then 的链式调用串联多个 同步/异步 任务
说明:如果想在then()中执行异步任务,必须返回一个新的promise不能直接调用 resolve / reject
new Promise((resolve, reject)=>{ console.log("执行任务1(同步)") setTimeout(()=>{ console.log("执行任务2(异步)") resolve(2) },1000) }).then( value =>{ console.log("任务2的结果"); console.log("执行任务3(同步)"); return 3 } ).then( value=>{ console.log("接受任务3的结果") return new Promise((resolve,reject)=>{ setTimeout(()=>{ console.log("执行任务4(异步)") resolve(4) }) }) } ).then( value=>{ console.log("接收任务4的结果") } )
6. promise 异常传透
1). 当使用promise的then链式调用的时候,可以到最后再指定失败的回调函数
2). 前面的任意操作出现了异常,都会传到最后的失败的回调中处理
new Promise((resolve,reject)=>{ reject(2) }).then( value=>{}, // reason=>{throw reason} ).then( value=>{}, // reason=>{throw reason} ).catch( reason=>{ console.log(reason) return new Promise(()=>{}) // 返回一个pending状态的promise ,后面的链式调用就不会继续执行 } ).then( // 这里面将不会继续执行 value=>{ }, reason=>{ } ) // 上面的任意一个promise发生错误,都会一层一层的传递到最后一个错误的回调中来处理 // 如果then()中不传递回调函数,就会默认传递 reason => {throw reason} ,将错误往下抛出
7. 如何中断Promise链?
在回调函数中返回一个pedding状态的promise对象