关于Promise,你必须知道的几点。

1.如何改变promise的状态promise

  1). resolve(value) 若是当前的状态是pedding 就会改成 resolved异步

  2). reject(reason) 若是当前状态是pedding 就会改成 rejected函数

2.一个promise指定多个成功 / 失败的回调,都会调用吗?spa

  当promise状态改变时,对应的回调函数都会调用code

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). 都有可能,正常状况下时先指定回调函数再改变状态,但也能够先改变状态,再指定回调。blog

  2). 如何先改变状态,再指定回调函数回调函数

    在执行器中直接调用resolve() / reject()同步

    再延迟更长的时间才调用thenconsole

  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对象

相关文章
相关标签/搜索