这个是最先的用回调函数处理异步
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')
})