# 解释下 Promise 与 Promise.all
promise 是什么?
Promise 是异步编程的一种解决方案,比传统的回调函数和事件更合理和强大。
所谓 Promise,简单来说就是一个容器,里面保存着某个未来才会结束的事情(通常是一个异步操作)。
从语法上说,Promise 是一个对象,从他可以获取异步操作的消息。
特点:
- 对象的状态不受外部影响
- 一旦状态改变,就无法再被改变。
缺点:一旦创建 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
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
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 回调
←
→
在线客服