Promise快速上手

2020-10-10  本文已影响0人  小妹呀

概述

回调函数JavaScript异步编程的根基,但如果我们直接使用传统回调方式去完成复杂的异步流程,就无法避免回调函数嵌套的问题,即常说的“回调地狱”。

为了解决这个问题,CommonJS社区提出了Promise规范,在ES2015中被标准化,成为语言规范。

Promise就是一个对象,用来表示一个异步任务在最终结束后,是成功还是失败。类似于内部对外界做出了一个“承诺”,一开始,处于待定状态(Pending,最终有可能是成功(Fulfilled状态,也有可能是失败(Rejected状态,最终的结果状态明确后,都会有相应的任务被执行,一但结果明确,就不可能再发生改变

快速上手

const promise = new Promise(function (resolve, reject) {
  // 这里用于兑现承诺
  // 这里的代码会被同步执行,属于同步任务
  console.log(1)
  resolve(100) // 承诺达成
  //reject(new Error('promise rejected')) // 承诺失败
})
// then 方法接收两个参数,第一个是成功回调,第二个是失败回调
promise.then(function(value) {
  // promise的回调属于微任务
  console.log('resolved', value)
}, function (error) {
  console.log('rejected', error)
})

如果在回调函数中又需要发起一次异步任务,循环往复,依然会出现“回调地狱”,这是使用Promise的一个常见误区,对于这种情况,我们应该借助于Promise then方法链式调用的特点,保证异步任务的扁平化。

链式调用

const promise = new Promise(function (resolve, reject) {
  resolve(100)
})
promise.then(function(value) {
  console.log('resolved', value) 
}).then(function (value){
  console.log(value) // undefined
  throw new Error()
}).catch(function (error) {
  // catch 方法捕获异常
  console.log('error') // 'error'
})

静态方法

resolve
reject
all
let p1 = new Promise((resolve, reject) => {
  resolve('p1')
})
let p2 = new Promise((resolve, reject) => {
setTimeout(function () {
    resolve('p2')
}, 1000)
  
})
let p3 = new Promise((resolve, reject) => {
  resolve('p3')
})
Promise.all([p1, p2, p3]).then(res => {
  // 返回的结果与参数Promise对应
  console.log(res) // ["p1", "p2", "p3"]
}).catch(error => {
  console.log(error)
})

race

all方法是等待所有任务结束,而race只会等待第一个结束的任务

上一篇下一篇

猜你喜欢

热点阅读