zoukankan      html  css  js  c++  java
  • promise

    这个是最先的用回调函数处理异步
    function
    asyncFun(a,b,cb){ setTimeout(function () {//异步需要异步语句,setTimeout ,setInterval,ajax,node.js.....这些都是异步语句,没有异步语句就不是异步的 cb(a+b)//这是回调,表示异步的事情做完了,继续做的事情 },200) } asyncFun(1,2,function (res) { console.log(res) }) console.log(2) //先输出2,再输出3 asyncFun(1,2,function(res){ if(res>2){ asyncFun(res,2,function(res){ if(res>4){ asyncFun(res,2,function(res){ console.log(res)//输出7,但是回调有很多层,陷入了回调地狱 }) } }) } })

    用promise可以解决回调地狱,让程序看起来更清晰,去掉了callback
     1 function asyncFun(a,b){
     2     return new Promise(function(resolve,reject){//resolve当异步有结果并且成功的时候调用它,并且会把结果传给这个函数
     3         if(typeof a!=='number' || typeof b!=='number'){
     4             reject(new Error('no number'))
     5         }
     6         setTimeout(function(){
     7             resolve(a+b)
     8         },200)
     9     })
    10 }
    11 //通过调用上面的函数会返回一个promise,这个promise会有一个then方法
    12 asyncFun(1,2)
    13     .then(function(res){
    14         if(res>2){
    15             return asyncFun(res,2)
    16         }
    17     },function(err){
    18         console.log('first---',err)
    19     })
    20     .then(function(res){
    21         if(res>4){
    22             return asyncFun(res,2)
    23         }
    24     })
    25     .then(function(res){
    26         if(res>4){
    27             console.log(res)
    28         }
    29     })
    30     .catch(function(err){//必须要用catch去捕获错误,如果前面已经有错误捕获,后面这个catch就不会进行
    31         console.log(err)
    32     })
    33 
    34 var promise=Promise.all([asyncFun(1,2),asyncFun(2,3),asyncFun(1,22)])//Promise.all方法将多个promise组装成一个,成功的时候返回一个结果数组
    35 // var promise=Promise.race([asyncFun(1,2),asyncFun(2,3),asyncFun(1,22)])//Promise.race是赛跑的意思,就是谁快谁出来
    36 promise.then(function(res){
    37     console.log(res)//[3,5,23]
    38 },function(err){
    39     console.log(err)
    40 })
    关于promise的错误机制
    class User{
        constructor(name,password){
            this.name=name
            this.password=password
        }
        validateName(cb){
            let name=this.name;
            return new Promise(function(resolve,reject){
                setTimeout(function(){
                    if(name==='xumin'){
                        resolve('success')
                    }else{
                        reject('error')
                    }
                })
    
            })
        }
        validatePassword(cb){
            let password=this.password;
            return new Promise(function(resolve,reject){
                setTimeout(function(){
                    if(password==='123'){
                        resolve('success')
                    }else{
                        reject('error')
                    }
                })
    
            })
        }
    }
    var user=new User('xumin','123ds')
    //then方法必须有一个参数,当resolve的时候会执行,如果reject时,就会执行第二个参数,第二个参数不存在的时候就会往下寻找catch,当第一个参数或第二个参数内部出现异常
    的时候,那个错误会被catch所捕获
    user.validateName() .then(
    function(res){ throw new Error('first error') // return user.validatePassword()//执行完成之后会继续往下找then },function(err){ console.log('second error') }) .catch(function(err){ console.log(err) return user.validatePassword() }) .then(function(res){ console.log(res) },function(err){ console.log('validate pwd err 1') throw new Error('xx') }) .catch(function(err){ console.log('validate pwd err 2') })







  • 相关阅读:
    spring的工厂类
    spring的基于XML方式的属性注入
    github上传大于100M的文件报错
    fatal: HttpRequestException encountered
    VAR 学习笔记3
    You are my great sunshine
    warning: LF will be replaced by CRLF in
    术语词汇
    XGBoost学习笔记2
    四大基本算法思想
  • 原文地址:https://www.cnblogs.com/xufeimei/p/10374833.html
Copyright © 2011-2022 走看看