前篇结尾说到 Promise
的语法部分,包含了4个方法,分别是 all()
、race()
、reject()
、resolve()
,下面每个方法都将以例子作为开始
Promise.all()
var val = 1;
function step1(resolve, reject) {
console.log('步骤一:执行');
if (val >= 1) {
resolve('Hello I am No.1');
} else if (val === 0) {
reject(val);
}
}
function step2(resolve, reject) {
console.log('步骤二:执行');
if (val === 1) {
resolve('Hello I am No.2');
} else if (val === 0) {
reject(val);
}
}
function step3(resolve, reject) {
console.log('步骤三:执行');
if (val === 1) {
resolve('Hello I am No.3');
} else if (val === 0) {
reject(val);
}
}
var promise1 = new Promise(step1);
var promise2 = new Promise(step2);
var promise3 = new Promise(step3);
var steps = [promise1, promise2, promise3];
Promise.all(steps).then(values => {
console.log(values);
});
/**
输出结果
步骤一:执行
步骤二:执行
步骤三:执行
["Hello I am No.1", "Hello I am No.2", "Hello I am No.3"]
**/
steps = [promise1, "promise2", promise3];
Promise.all(steps).then(values => {
console.log(values);
});
/**
输出结果
步骤一:执行
步骤二:执行
步骤三:执行
["Hello I am No.1", "promise2", "Hello I am No.3"]
**/
简单分析一下以上代码,首先定义了3个函数 step1
、step2
、step3
,将这3个函数作为 Promise
的回调函数新建3个 Promise
对象,作为一个数组传给 all
此时 all
会做什么呢?它将会依次处理这3个 Promise
,如果最终这三个 Promise
都达到 fulfilled
状态,那么 all
返回的 Promise
也会达到 fulfilled
的状态。在处理每一个 Promise
的时候,会将传入 resolve
的参数保存在一个数组中,最终 all
调用 resolve
的时候,将以这个数组作为参数,这个数组就是 ["Hello I am No.1", "Hello I am No.2", "Hello I am No.3"]
,最后调用 then 的时候,values 的值即为这个数组
这个例子后面我将 promise2
替换为 "promise2"
字符串,可以看到输出变为["Hello I am No.1", "promise2", "Hello I am No.3"]
,这是因为内部会判断这个值的类型,如果不是一个对象或者方法,则直接将这个值保存在数组中
总结一下,all
方法接受一个可迭代的对象,比如 Array
,在这个迭代参数内所有的 Promise
都被 resolved
之后,将返回一个被 resolved
的 Promise
对象,并将迭代参数内所有 Promise
调用resolve时所传的参数保存在一个数组内,作为最终 resolve
调用时的参数
网友评论