回顾下之前整理的promise

es6的集成方法
Promise

pending: 初始状态,不是成功或失败状态。
fulfilled: 意味着操作成功完成。
rejected: 意味着操作失败。

当Promise状态为fulfilled时,调用 then 的 onfulfilled 方法,当Promise状态为rejected时,调用 then 的 onrejected 方法, 所以在异步操作的完成和绑定处理方法之间不存在竞争)。

  • 属性
    Promise.length
    长度属性,其值总是为 1 (构造器参数的数目).
    Promise.prototype
    表示 Promise 构造器的原型.
    */
let myFirstPromise = new Promise(function (resolve, reject) {
    //当异步代码执行成功时,我们才会调用resolve(...), 当异步代码失败时就会调用reject(...)
    //在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法.
    setTimeout(function () {
        resolve("成功!"); //代码正常执行!
        //reject("失败");
    }, 250);
});

myFirstPromise.then(function (successMessage) {
    //successMessage的值是上面调用resolve(...)方法传入的值.
    //successMessage参数不一定非要是字符串类型,这里只是举个例子
    console.log("Yay! " + successMessage);
});

//then->function(resolve)->function(yar) 调用顺序
function runAsync1() {
    var p = new Promise(function (resolve, reject) {
        //做一些异步操作
        setTimeout(function () {
            console.log('异步任务1执行完成');
            resolve('随便什么数据1');
        }, 1000);
    });
    return p;
}
function runAsync2() {
    var p = new Promise(function (resolve, reject) {
        //做一些异步操作
        setTimeout(function () {
            console.log('异步任务2执行完成');
            resolve('随便什么数据2');
        }, 1000);
    });
    return p;
}
function runAsync3() {
    var p = new Promise(function (resolve, reject) {
        //做一些异步操作
        setTimeout(function () {
            console.log('异步任务3执行完成');
            resolve('随便什么数据3');
        }, 1000);
    });
    return p;
} 

runAsync1()
    .then(function (data) {
        console.log(data);
        return runAsync2();
    })
    .then(function (data) {
        console.log(data);
        return runAsync3();  //这里直接返回数据
    })
    .then(function (data) {
        console.log(data);
    });
    //这里依次执行

这里写图片描述

接下来我们看看关于参数的传递

function getNumber() {
    var p = new Promise(function (resolve, reject) {
        //做一些异步操作
        setTimeout(function () {
            var num = Math.ceil(Math.random() * 10); //生成1-10的随机数
            if (num <= 5) {
                resolve(num);
            }
            else {
                reject('数字太大了',num);
            }
        }, 2000);
    });
    return p;
}

getNumber().then(
    function (data) {
        console.log('resolved');
        console.log(data);
    },
    function (reason, data) {
        console.log('rejected');
        console.log(reason);
        console.log(data);
    }
);

这里写图片描述
可以看到reject()对参数只能传递一个,并且调用了第二个函数。(reject 和 resolve 都是只能接受一个参数)

继续往下看

getNumber()
    .then(function (data) {
        console.log('resolved');
        console.log(data);
       //console.log(somedata); //此处的somedata未定义
    })
    .catch(function (reason) {
        console.log('rejected');
        console.log(reason);
    });

这里写图片描述
在一个promise链中,只要任何一个promise被reject,promise链就被破坏了,reject之后的promise都不会再执行,而是直接调用.catch方法。

特性差不多了,接下来说一些方法

  • all all会把所有的promise进行并行异步 所有的执行完才会回调then
  • race race会把所有的promise进行并行异步 只有最先完成的才会回调then
   function runAsync1() {
        var p = new Promise(function (resolve, reject) {
            //做一些异步操作
            setTimeout(function () {
                console.log('异步任务1执行完成');
                resolve('随便什么数据1');
            }, 1000);
        });
        return p;
    }
    function runAsync2() {
        var p = new Promise(function (resolve, reject) {
            //做一些异步操作
            setTimeout(function () {
                console.log('异步任务2执行完成');
                resolve('随便什么数据2');
            }, 2000);
        });
        return p;
    }
    function runAsync3() {
        var p = new Promise(function (resolve, reject) {
            //做一些异步操作
            setTimeout(function () {
                console.log('异步任务3执行完成');
                resolve('随便什么数据3');
            }, 3000);
        });
        return p;
    }
Promise.all([runAsync1(), runAsync2(), runAsync3()])   //all会把所有的promise进行并行异步  所有的执行完才会回调then
    .then(function (results) {
        console.log(results);
    });
结果
异步任务1执行完成
异步任务2执行完成
异步任务3执行完成
[ '随便什么数据1', '随便什么数据2', '随便什么数据3' ]
Promise
    .race([runAsync1(), runAsync2(), runAsync3()])   //race会把所有的promise进行并行异步  只有最先完成的才会回调then    
    .then(function (results) {
        console.log(results);
    });
结果
异步任务1执行完成
随便什么数据1
异步任务2执行完成
异步任务3执行完成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值