Promise 對象用于表示一個異步操作的最終完成 (或失敗)及其結(jié)果值恋拍。
1隧土、在ES6之前:利用回調(diào)函數(shù)解決異步操作的問題
(1)提针、什么是回調(diào)函數(shù)
function B(){ A() }
function A(){}
B(A)
在將函數(shù)A作為參數(shù)傳給函數(shù)B,等函數(shù)B執(zhí)行完次洼,然后調(diào)用函數(shù)A关贵,調(diào)用函數(shù)A的過程就是回調(diào)。
例子1:
function 獲取用戶信息(fn){
fn('姓名:小明')
}
function 打印用戶信息(用戶信息){
console.log('這是我打印出來的用戶信息')
console.log(用戶信息)
}
獲取用戶信息(打印用戶信息)
例子2:
回調(diào)地獄:在函數(shù)里面不斷有函數(shù)回調(diào)卖毁,容易導(dǎo)致參數(shù)不知道如何傳遞
function 獲取用戶信息(fn){
fn('姓名:小明')
}
獲取用戶信息(function (用戶信息){
console.log(用戶信息)
保存用戶信息(用戶信息,function(){
獲取另一個用戶的信息(function(另一個用戶信息){
保存用戶信息
})
})
})
回調(diào)函數(shù)
缺點1:回調(diào)地獄
缺點2:不知道怎么使用 Node/jQuery
2、ES6:利用Promise解決回調(diào)地獄問題
function 獲取用戶信息(fn){
return new Promise(function(resolve,reject){
console.log('第1次獲取用戶信息中..')
resolve('姓名小明') //將參數(shù)傳遞給打印用戶信息
})
}
function 打印用戶信息(用戶信息){
return new Promise(function(resolve,reject){
console.log(用戶信息)
resolve()
})
}
function 獲取另一個用戶信息(fn){
return new Promise(function(resolve,reject){
console.log('第2次獲取用戶信息中..')
resolve('姓名小紅')
})
}
獲取用戶信息()
.then(打印用戶信息)
.then(獲取另一個用戶信息)
.then(打印用戶信息)
(1)、如何理解Promise
1亥啦、new Promise()
接受一個函數(shù)炭剪,函數(shù)參數(shù)必須包括resolve
和reject
方法,其中resolve
代表成功要執(zhí)行的翔脱,reject
代表失敗要執(zhí)行的奴拦。
2、resolve(data)
中data代表.then
要傳入的數(shù)據(jù)届吁,reject(res)
中res代表失敗的原因
3错妖、.then(fn1,fn2)
接受兩個函數(shù)作為參數(shù)傳入,第一個函數(shù)是成功時候執(zhí)行疚沐,第二個是失敗時候執(zhí)行暂氯。
4、.then(fn1,fn2).then(fn3,fn4)
第一次.then
亮蛔,如果成功痴施,則執(zhí)行fn1,失敗則執(zhí)行fn2究流;第二次.then
如果fn1或fn2都順利執(zhí)行辣吃,并且fn1和fn2沒有報錯或者fn2中沒有reject()
,或者fn2中沒有返回新的Promise芬探,則執(zhí)行fn3;否則執(zhí)行fn4神得。
return new Promise(function(resolve,reject){
console.log('第1次獲取用戶信息中..')
resolve('姓名小明')
})
例子1:(只有一個then情況)
function 獲取用戶信息(name){
return new Promise(function(resolve,reject){
if(name==='小明'){
console.log('我認(rèn)識小明')
resolve('小明是一個學(xué)生')
}else{
console.log('不認(rèn)識')
reject()
}
})
}
例子1調(diào)試(1):
獲取用戶信息('小明')
.then(
function(d){console.log(d)},
function(){console.log('它真的不認(rèn)識')}
)
例子1調(diào)試(2):
獲取用戶信息('小明')
.then(
function(d){console.log(d)},
function(){console.log('它真的不認(rèn)識')}
)
例子2:(多個then情況)
function 獲取用戶信息(name){
return new Promise(function(resolve,reject){
if(name==='小明'){
console.log('我認(rèn)識小明')
resolve(['小明','是學(xué)生'])
}else{
console.log('不認(rèn)識')
reject('不認(rèn)識')
}
})
}
function 獲取好友信息(name){
console.log('獲取好友信息在執(zhí)行')
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 打印失敗理由(res){
console.log('失敗的理由是'+res)
return Promise.reject('沒搞定') //我沒有搞定這個失敗兔甘,請后面的成功回調(diào)不要執(zhí)行
}
例子2調(diào)試1:
獲取用戶信息('小明')
.then(打印信息,打印失敗理由)
.then(獲取好友信息)
.then(打印信息)
例子2調(diào)試2:
獲取用戶信息('小紅')
.then(打印信息,打印失敗理由)
.then(獲取好友信息)
.then(打印信息)
(2)、結(jié)合await不要then就能拿到數(shù)據(jù)
將例子2調(diào)試1改成下面:
let 用戶信息= await 獲取用戶信息('小明')
console.log(用戶信息)
將例子2調(diào)試2改成下面:
try{
let 用戶信息= await 獲取用戶信息('小紅')
console.log(用戶信息)
}catch(error){ //錯誤原因
console.log('失敗理由是')
console.log(error)
}