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') })







原文地址:https://www.cnblogs.com/xufeimei/p/10374833.html