明白和运用Promise.all和Promise.race

JavaScript的天下中,一切代码都是单线程实行的。异步实行能够用回调函数完成,然则某些场景并不好用,且不容易复用。Promise对象这类链式写法的优点在于,先一致实行逻辑,不关心怎样处置惩罚效果,然后,依据效果是胜利照样失利,在未来的某个时刻挪用success函数或fail函数。

Pomise.all的运用

Promise.all能够将多个Promise实例包装成一个新的Promise实例。同时,胜利和失利的返回值是差别的,胜利的时刻返回的是一个效果数组,而失利的时刻则返回最早被reject失利状况的值
Promise.all中传入的是数组,返回的也是是数组,而且会将举行映照,传入的promise对象返回的值是根据递次在数组中分列的,然则注重的是他们实行的递次并非根据递次的,除非可迭代对象为空。

可迭代对象:
遍历Array能够采纳下标轮回,遍历Map和Set就没法运用下标。为了一致鸠合范例,ES6规范引入了新的iterable范例,Array、Map和Set都属于iterable范例。具有iterable范例的鸠合能够经由过程新的for … of轮返来遍历。

示例代码以下:

let p1 = new Promise((resolve, reject) => {
  resolve('胜利了')
})

let p2 = new Promise((resolve, reject) => {
  resolve('success')
})

let p3 = Promse.reject('失利')

Promise.all([p1, p2]).then((result) => {
  console.log(result)               //['胜利了', 'success']
}).catch((error) => {
  console.log(error)
})

Promise.all([p1,p3,p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)      // 失利了,打出 '失利'
})

Promse.all在处置惩罚多个异步处置惩罚时异常有效,比如说一个页面上须要等两个或多个ajax的数据返来今后才一般显现,在此之前只显现loading图标。

代码模仿:

let wake = (time) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(`${time / 1000}秒后醒来`)
    }, time)
  })
}

let p1 = wake(3000)
let p2 = wake(2000)

Promise.all([p1, p2]).then((result) => {
  console.log(result)       // [ '3秒后醒来', '2秒后醒来' ]
}).catch((error) => {
  console.log(error)
})

须要特别注重的是,Promise.all取得的胜利效果的数组内里的数据递次和Promise.all接收到的数组递次是一致的,即p1的效果在前,即使p1的效果猎取的比p2要晚。这带来了一个绝大的优点:在前端开辟要求数据的过程当中,偶然会碰到发送多个要求并依据要求递次猎取和运用数据的场景,运用Promise.all毫无疑问能够处理这个题目。

Promise.race的运用

望文生义,Promse.race就是竞走的意义,意义就是说,Promise.race([p1, p2, p3])内里哪一个效果取得的快,就返回谁人效果,不论效果自身是胜利状况照样失利状况。

let p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success')
  },1000)
})

let p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('failed')
  }, 500)
})

Promise.race([p1, p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)  // 翻开的是 'failed'
})
    原文作者:MangoGoing
    原文地址: https://segmentfault.com/a/1190000019006183
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞