Promise

Promise接受一个进行异步操作的执行函数(executor), 默认参数是resolve和reject,初始状态为pending, 执行成功则调用resolve,返回结果,状态为 fullfilled,出现error则调用reject, 状态为 rejected

  1. let promise = new Promise((resolve, reject)=>{
  2. setTimeout(()=>{
  3. let n = Math.floor(Math.random() * 6 + 1)
  4. if(n > 3){
  5. resolve(n)
  6. } else {
  7. reject(new Error('you lose'))
  8. }
  9. },1000)
  10. })

promise接受.then操作,then的参数为2个函数,如果promise resolve则调用第一个函数,如果reject则调用第二个函数

  1. promise.then((res)=>{console.log(res)}, (err)=>{console.log(err)})

如果只想捕获error, 可以用.catch

  1. promise.catch(err => {console.log(err)})

当然你也可以写一个函数,让这个函数返回promise

  1. function fn(){
  2. return new Promise((resolve, reject)=>{
  3. setTimeout(()=>{
  4. let n = Math.floor(Math.random() * 6 + 1)
  5. if(n > 3){
  6. resolve(n)
  7. } else {
  8. reject(new Error('you lose'))
  9. }
  10. },1000)
  11. })
  12. }
  13. fn().then((res)=>{console.log(res)}, (err)=>{console.log(err)})

Promise.all

Promise.all 接受一个promise数组,等待所有的promise都settle,如果所有的promise都resolve, 则执行.then的第一个函数,返回值是个数组,只要有任意一个promise reject,就抛出错误,执行.then的第二个函数

  1. function fn(){
  2. return new Promise((resolve, reject)=>{
  3. setTimeout(()=>{
  4. let n = Math.floor(Math.random() * 6 + 1)
  5. if(n > 3){
  6. resolve(n)
  7. } else {
  8. reject(new Error('you lose'))
  9. }
  10. },1000)})
  11. }
  12. Promise.all([fn(), fn()])
  13. .then((res)=>{console.log(res)}, (err)=>{console.log(err)})

Promise.race

Promise.race 同样接受一个promise数组,只要有一个promise resolve或reject, 其他的promise就会忽略,并根据这个promise是resolve还是reject各自调用.then的函数

Promise.allSettled

Promise.allSettled同样接受一个promise数组,会等待所有promise settle, 返回的结果数组,包含了每个promise的status和 value或reason

  1. [
  2. {status: 'fulfilled', value: ...response...},
  3. {status: 'fulfilled', value: ...response...},
  4. {status: 'rejected', reason: ...error object...}
  5. ]

async/await

async能与promise结合使用,使异步函数更像是标准的同步函数
function前的async的作用:

  • 让这个函数总是返回一个 promise。
  • 允许在该函数内使用 await。

Promise 前的关键字 await 使 JavaScript 引擎等待该 promise settle,然后:

  1. 如果有 error,就会抛出异常 — 就像那里调用了 throw error 一样。
  2. 否则,就返回结果。
  3. 我们可以用 try..catch 来捕获error ```javascript function fn(){ return new Promise((resolve, reject)=>{ setTimeout(()=>{ let n = Math.floor(Math.random() * 6 + 1) if(n > 3){ resolve(n) } else { reject(new Error(‘you lose’)) }

    },1000)}) }

async function fn2(){ try{ let result = await fn() console.log(result) } catch(err){ console.log(err) }

}

fn2()

  1. await后面如何接多个promise?<br />await后接Promise.all或者Promise.race, Promise.allPromise.race仍然是个promise
  2. ```javascript
  3. async function fn2(){
  4. try{
  5. let result = await Promise.all([fn(),fn(),fn()])
  6. console.log(result)
  7. } catch(err){
  8. console.log(err)
  9. }
  10. }