promise串行、并行-转

105 阅读2分钟

promise串行

Promise一单开始执行,执行上是不存在串行执行的,比如典型的计时的Promise。

const p1 =new Promise((resolve, reject) => {
        setTimeout(function () {
            resolve(1)
        }, 1000)
    })
const p2 =new Promise((resolve, reject) => {
        setTimeout(function () {
            resolve(2)
        }, 2000)
function write(obj){
    for(let key in obj){
        if(obj[key]){
            document.write(key + ': ' + obj[key] + '<br>');
        }
    }
}
var condition = {
    name: null,
    age: null,
    addr: null
};
var func = {
    getName: function(resolve,reject){
        return new Promise(function(resolve,reject){
            log('getName request start...')
            setTimeout(function(){
                log('getName request complete!')
                let random = Math.random();
                let ret = null;
                if(random > 0.1){
                    condition.name = 'wangjun';
                    ret = {
                        code: 0,
                        time: random
                    };
                    resolve(ret);
                }
                else{
                    ret = {
                        name: 'getName',
                        code: 1,
                        time: random
                    };
                    reject(ret);
                }
            },500);
        });
    },
    getAge: function(){
        return new Promise(function(resolve,reject){
            log('getAge request start...')
            setTimeout(function(){
                log('getAge request complete!')
                let random = Math.random();
                let ret = null;
                if(random > 0.2){
                    condition.age = 20;
                    ret = {
                        code: 0,
                        time: random
                    };
                    resolve(ret);
                }
                else{
                    ret = {
                        name: 'getAge',
                        code: 1,
                        time: random
                    };
                    reject(ret);
                }
            },500);
        });
    },
    getAddr: function(){
        return new Promise(function(resolve,reject){
            log('getAddr request start...')
            setTimeout(function(){
                log('getAddr request complete!')
                let random = Math.random();
                let ret = null;
                if(random > 0.2){
                    condition.addr = 'shenzhen';
                    ret = {
                        code: 0,
                        time: random
                    };
                    resolve(ret);
                }
                else{
                    ret = {
                        name: 'getAddr',
                        code: 1,
                        time: random
                    };
                    reject(ret);
                }
            },500);
        });
    }
}
/**
 * 串行promise
 * 任一环节的then执行reject都会导致执行链直接跳到catch
 * then的执行取决于前面then是否执行的resolve
 */
var promise = new Promise(function(resolve,reject){
    resolve();
});
promise.then(func.getName)
.then(func.getAge)
.then(func.getAddr)
.then(function(){
    write(condition);
})
.catch(function(res){
    log(res.name + ' failed!');
    console.log(condition);
});

promise并行

promise.all和promise.race就可以实现
这个功能Promise自身已经提供,不是本文的重点。主要是依赖Promise.allPromise.race

Promise.all是所有的Promise执行完毕后(reject|resolve)返回一个Promise对象。

Promise.race是任意一个Promise对象执行完毕后返回一个Promise对象。

Promise.all([func.getName(),func.getAge(),func.getAddr()]).then((res) => {
    console.log(res);//返回的是三个函数执行返回的结果组成的数组;只有当三者均执行成功时才会返回结果
    console.log(condition);
}).catch((res) => {
    console.log(res)//当某个函数执行失败时,返回对应的返回参数;任意一个函数执行失败均会返回结果。但不影响其他函数的执行
    console.log(condition);
    console.log(res.name + ' falied!')
})