# 解释下 Promise 与 Promise.all

promise 是什么?

Promise 是异步编程的一种解决方案,比传统的回调函数和事件更合理和强大。

所谓 Promise,简单来说就是一个容器,里面保存着某个未来才会结束的事情(通常是一个异步操作)。

从语法上说,Promise 是一个对象,从他可以获取异步操作的消息。

特点:

  1. 对象的状态不受外部影响
  2. 一旦状态改变,就无法再被改变。

缺点:一旦创建 promise 就会立即执行

const newPromise = new promise((resolve, reject) => {
  if (success) {
    resolve()
  } else {
    reject()
  }
})
  .then(
    data => {
      console.log(data)
    },
    error => {
      console.log(error)
    }
  )
  .catch(null, error => {
    console.log(error)
  })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

then 方法可以接受两个回调函数作为参数,

第一个回调函数是 promise 对象的状态变为 resolved 的时候调用,

第二个回调函数是 promise 对象的状态变为 rejected 时调用。

其中第二个函数是可选的,不一定需要提供。

catch 方法是.then(null, rejection)的别名,用于指定发生错误时的回调函数。

promise.all 是什么?

Promise.all([p1, p2, p3]) 方法返回一个 Promise 实例,此实例在 p1,p2,p3 都“完成(resolved)”时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。

result = arr.map(i => {
  const rowPromise = filtered
    .sort({ create_time: -1 }) //-1降序 1升序
    .skip(offset > -1 ? offset : 0)
    .limit(limit <= 200000 ? limit : 200000)
    .toArray()
  return rowPromise
})

promise
  .all(result)
  .then(total => resolve(total))
  .catch(err => reject(err))
1
2
3
4
5
6
7
8
9
10
11
12
13

promise.all 中传入的 result 一定要是一个数组。返回的是个 promise 实例,机制与 promise 一致

promise.race 与 promise.all 类似,当 p1,p2,p3 中有一个 resolve 或 reject 时调用相应的 resolve/reject 回调

在线客服