zoukankan      html  css  js  c++  java
  • 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并没有停止,仍旧在执行。

  • 相关阅读:
    java 排序算法
    简单选择排序
    .net 调用css/javascipt出现的问题及解决
    《大道至简》的幕后故事(4):“愚公移山记”军事地理篇
    asp.net web services
    《大道至简》的幕后故事:终结篇、勘误和PDF下载
    Java开发人员的十大戒律
    NUnit 使用
    快速排序
    .NET中回发或回调参数无效问题的解决
  • 原文地址:https://www.cnblogs.com/xumqfaith/p/8335581.html
Copyright © 2011-2022 走看看