回调:
1.把一个函数A传给另一个函数B调用,那么A就是回调函数。
function B(){ A() //调用方式:回调 } function A(){}
eg.具名回调
function 获取用户信息(fn){ fn('姓名:笨笨') } function 打印用户信息(用户信息){ console.log(用户信息) } 获取用户信息(打印用户信息) //这里的打印用户信息对应 fn这个函数 //调用'获取用户信息'这个函数时,给它传了一个函数(打印用户信息)
// 匿名回调
function 获取用户信息(fn){ fn('姓名:笨笨') } 获取用户信息(function (用户信息){ console.log(用户信息) })
2.回调缺点:
1.回调地狱
2.不知道怎么使用 Node\JQuery
clipboard.pngpromise可以让地狱变成只有一层,然后用简单的api(.then)将他们链接起来。
function 获取用户信息(){
return new Promise(function(resolve,reject){
//返回一个promise对象,所以最后才能用.then
console.log('第一次获取用户信息')
resolve('姓名笨笨')
})
}
function 打印用户信息(用户信息){
return new Promise(function(resolve,reject){
console.log(用户信息)
resolve()
})
}
function 获取另一个用户信息(){
return new Promise(function(resolve,reject){
console.log('第二次获取用户信息')
recolve('姓名小白')
})
}
获取用户信息()
.then(打印用户信息)
.then(获取另一个用户信息)
.then(打印用户信息)
promise用法:
function 获取用户信息(name){
return new Promise (function(resolve,reject){
if(name === '笨笨'){
resolve(['笨笨','是个小胖子'])
}else{
reject('不认识')
}
})
}
function 获取好友信息(name){
return new Promise(function(resolve,reject){
if(name ==='笨笨'){
resolve('张三、李四、王五')
}else{
reject()
}
})
}
function 打印信息(data){
return new Promise(function(resolve,reject){
console.log(data)
resolve(data[0])
})
}
function 打印失败理由(理由){
return new Promise(function(resolve,reject){
console.log('失败的理由'+理由)
reject('搞不定,我太渣了') //我没有搞定失败,后面的成功回调不要执行
//如果没有这句,后面会继续执行,因为没有return
})
// 也可以直接return一个Promise.reject
return Promise.reject('没搞定')
}
function 打印上次失败理由(理由){
console.log('前面好像没搞定,理由是'+理由)
}
获取用户信息('笨笨') //这里只能获取到promise对象
.then(打印信息,打印失败理由) //只有'打印信息,打印失败理由'都成功了才能执行'获取好友信息'
.then(获取好友信息,打印上次失败理由) //当上面有一个失败,就走'打印上次失败理由'
.then(打印信息)
await 用法:
let 用户信息 = 获取用户信息('笨笨') //这里可以直接获取到成功
//获取成功、失败方法
try{
let 用户信息 = 获取用户信息('笨笨')
console.log(用户信息)
}catch(error){
console.log('失败的理由是'+error)
}
其他api
.catch //只处理失败的函数
.catch(function(){})
//等同于
.then(null,function(){})
.finally //无论失败或者成功都执行
.finally(f1)
//等同于
.then(f1,f1)
.all //等多个promise都成功后在执行
Promise.all([P1,P2,P3]).then(function(values){
console.log(values)
})
.race //只要有一个成功就调用
Promise.race([P1,P2,P3]).then(function(value){
console.log(value)
})
网友评论