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