Javascript: Promise 学习笔记(2)

作者: AlwaysBee | 来源:发表于2016-01-20 21:26 被阅读50次

前篇结尾说到 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个函数 step1step2step3,将这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 之后,将返回一个被 resolvedPromise 对象,并将迭代参数内所有 Promise 调用resolve时所传的参数保存在一个数组内,作为最终 resolve 调用时的参数

相关文章

网友评论

    本文标题:Javascript: Promise 学习笔记(2)

    本文链接:https://www.haomeiwen.com/subject/nwslkttx.html