Promise.all与Promise.race

Promise.all

Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例

1
2
3
4
5
6
7
8
9
10
var p1 = new Promise((reslove, reject)=> {
reslove(1)
})
var p2 = new Promise((reslove, reject)=> {
reslove(2)
})
var p3 = new Promise((reslove, reject)=> {
reslove(3)
})
var p = Promise.all([p1,p2,p3])

p的状态由p1,p2,p3共同决定,有两种情况:

  • 状态都是fulfilled ,p的状态才会变成fulfilled p1,p2,p3组成一个数组作为返回值

    1
    2
    3
    4
    5
    p.then((res)=> {
    console.log(res) //[1, 2, 3]
    }).catch(res=> {
    console.log(res)
    })
  • 有一个状态被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数

    1
    2
    3
    4
    5
    6
    7
    8
    var p2 = new Promise((reslove, reject)=> {
    reject(2)
    })
    p.then((res)=> {
    console.log(res)
    }).catch(res=> {
    console.log(res) //2
    })

Promise.race

Promise.race()方法也是是将多个 Promise 实例,包装成一个新的 Promise 实例。

1
2
3
4
5
6
7
8
9
10
var p1 = new Promise((reslove, reject)=> {
reslove(1)
})
var p2 = new Promise((reslove, reject)=> {
reslove(2)
})
var p3 = new Promise((reslove, reject)=> {
reslove(3)
})
var p = Promise.race([p1,p2,p3])

只要p1p2p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数 。

1
2
3
4
5
6
7
8
9
var p2 = new Promise((reslove, reject)=> {
reject(2)
})
p.then((res)=> {
console.log(res) //1
}).catch(res=> {
console.log(res)
})
//也就是要确定第一个改变状态的返回值

参考文章