ES6之Promise的基本用法

之前多次看过阮一峰的ES6教程,对Promise也简单的理解过,但是,由于没在项目中运用过,所以记忆的并不深刻,昨天在进行项目的改良,有一个地方需要用到Promise

所以就这样写了:

onload函数,是向后台请求数据的异步函数,

this.number是通过onload函数得到的,

运行起来老是会出现这样那样的问题

后来竟然指出,原来是我的Promise函数写错了

resolve应该传给onload函数,在它的异步成功之后,再resolve();

经过一番更改之后,果然就好了。,

贴一张图;

一个简单的例子,getTime()为异步函数,

此时的执行顺序为,

延迟3秒之后,输出:

延迟3秒执行

1

执行then函数

-----------------------------------------------------------2018-06-04-------------------------------------------------------------------------

 

回调函数把上一个then中返回的值当作参数值提供给当前的then方法调用
then方法执行完毕后需要返回一个新的值给下一个then调用(没有返回值默认使用undefined)
每一个then只能使用前一个then的返回值
若then中传的不是函数,则必须被忽略

function isAsync1(){
                var p = new Promise(function(resolve,reject){
                    setTimeout(function(){
                        console.log('isAsync1数据')
                        resolve('isAsync1函数')
                    },1000)
                })
                return p
            }
            function isAsync2(){
                var p = new Promise(function(resolve,reject){
                    setTimeout(function(){
                        console.log('isAsync2数据')
                        resolve('isAsync2函数')
                    },1000)
                })
                return p
            }
            function isAsync3(){
                var p = new Promise(function(resolve,reject){
                    setTimeout(function(){
                        console.log('isAsync3数据')
                        resolve('isAsync3函数')
                    },1000)
                })
                return p
            }
            isAsync1()
            .then(function(data){
                console.log(data)
                return isAsync2()
            })
            .then(function(data){
                console.log(data)
                return isAsync3()
            })
            .then(function(data){
                console.log(data)
            })

reject的用法

 

function getNumber(){
                var p = new Promise(function(resolve,rejcet){
                    setTimeout(function(){
                        var num = Math.ceil(Math.random()*10);
                        if(num<=5){
                            resolve(num)
                        }else{
                            rejcet('数字太大了')
                        }
                    },1000)
                })
                return p;
            }
            getNumber()
            .then(
                function(data){
                    console.log('resolved')
                    console.log(data)
                },
                function(reason,data){
                    console.log('rejected')
                    console.log(reason)
                }
            )

 会得到下面两种情况

catch 

function getNumber(){
                var p = new Promise(function(resolve,rejcet){
                    setTimeout(function(){
                        var num = Math.ceil(Math.random()*10);
                        if(num<=5){
                            resolve(num)
                        }else{
                            rejcet('数字太大了')
                        }
                    },1000)
                })
                return p;
            }
            getNumber()
            .then(function(data){
                    console.log('resolved')
                    console.log(data)
                }
            )
            .catch(function(reason,data){
                    console.log('rejected')
                    console.log(reason)
            })

 

 catch还有另外一个作用:在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会

报错卡死js,而是会进到这个catch方法中。

all的用法

Promise的all方法提供了并行操作执行异步操作的能力,并且在所有异步操作执行完后才执行回调。仍以定义的3个函数

Promise.all([isAsync1(),isAsync2(),isAsync3()])
.then(function(results){
             console.log(results)
       })

race的用法

all方法的效果实际上是【谁跑的慢,以谁为准执行回调】,那么相对的就有一个方法【谁跑得快,以谁为准执行回调】

 

Promise.race([isAsync1(),isAsync2(),isAsync3()])
            .then(function(results){
                console.log(results)
            })

在then里面的回调开始执行时,isAsync2和isAsync3并没有停止,仍旧在执行。

 

posted @ 2018-01-23 14:22  伊优  阅读(367)  评论(0编辑  收藏  举报