js基础——promise

245 阅读2分钟

一、使用场景:

处理异步任务时,避免回调地狱,可以使用return,throw 等关键词,请求图片,ajax请求等

常用方法

(1)Promise.then\ catch

包含两个参数成功,失败,一旦有结果不可逆

let promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    let num = parseInt(Math.random()*100) 
    if (num % 2 === 0) {
      // 偶数
      resolve(num)
    } else {
      // 奇数
      reject(num)
    }
  }, 1000);
})

不可逆的例子

let promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    let num = parseInt(Math.random()*100) 
    if (num % 2 === 0) {
      // 偶数
      resolve(num)
    } else {
      // 奇数
      reject(num)
    }
  }, 1000);
})

promise.then((num)=>{
  console.log(num, 'ok')
}).catch((err)=>{
    console.log(err, 'err')
})

// 一旦有结果不会发生改变,下边运行结果和上边完全一致
setTimeout(() => {
  promise.then((num)=>{
    console.log(num, 'ok')
  }).catch((err)=>{
    console.log(err, 'err')
  })
}, 3000);

(2)Promise.finally

无论promise的结果是fufiled 还是rejected , finally 最终都会执行,并且没有参数

promise.then((num)=>{
  console.log(num, 'ok')
}).finally(()=>{
  // 无论resolve 还是reject 都会执行finally
})

(3)Promise.resolve 和 Promise.reject

可以将一个普通对象转化为promise对象

Promise.resolve('ok')

// 等同于

new Promise((resolve, reject)=>{
    resolve('ok')
})



const p = Promise.reject('出错了');
// 等同于
const p = new Promise((resolve, reject) => reject('出错了'))

p.then(null, function (s) {
  console.log(s)
});
// 出错了

(4)Promise.all

参数为数组,数组中的元素都是promise 对象,如果不是会被自动转化, 如果数组中所有promise的结果都为resolve, Promise.all的状态才会是resolve,如果有rejected,则Promise.all的最终状态就是如果有rejected


let a = new Promise((resolve, reject)=>{
  setTimeout(()=>{
    resolve('ok')
  },1000)
})
let b = new Promise((resolve, reject)=>{
  setTimeout(()=>{
    reject('no')
  },1000)
})
let c = new Promise((resolve, reject)=>{
  setTimeout(()=>{
    resolve({a:1})
  },1000)
})
Promise.all([a,b,c]).then((data)=>{
  console.log(data)
}).catch((err)=>{
  console.log(err)
})

(4)Promise.race

与all方法参数相似,但不同之处在于,race的结果只受第一个结果的影响,当有一个完成后,race便有了结果


let a = new Promise((resolve, reject)=>{
  setTimeout(()=>{
    resolve('ok')
  },1000)
})
let b = new Promise((resolve, reject)=>{
  setTimeout(()=>{
    reject('no')
  },1000)
})
let c = new Promise((resolve, reject)=>{
  setTimeout(()=>{
    resolve({a:1})
  },1000)
})
Promise.race([a,b,c]).then((data)=>{
  console.log(data, '++++race')
}).catch((err)=>{
  console.log(err)
})