使用Promise鏈式調用解決多個異步回調的問題
比如我們平常經常遇到的一種情況:
網站中需要先獲取用戶名,然后再根據用戶名去獲取用戶信息。這里獲取用戶名getUserName()和獲取用戶信息getUser()都是調用接口的異步請求。在獲取用戶信息之前,需要先獲得用戶名。也就是說getUser依賴於getUserName的狀態。
一:promise.all()
function getUserPromise(promiseX, promiseY){
return Promise.all([promiseX, promiseY])
.then(values =>
// 返回的values由 promiseX 與 promiseY返回的值所構成的數組。
values
)
}
function getUserName(){
let data = 'superman';
return new Promise((resolve, reject) => {
setTimeout(resolve(data), 1000);
})
}
function getUser(){
let data = {
id:1,
username: 'superman',
gender: 'male'
}
return new Promise((resolve, reject) => {
setTimeout(resolve(data), 2000);
})
}
getUserPromise(getUserName(), getUser())
.then(data => {
// 這里的data就是包含了getUserName 和 getUser返回值所組成的數組
console.log(data); // [ 'superman', { id: 1, username: 'superman', gender: 'male' } ]
})
二:鏈式調用
function getUserName(){
let data = 'superman';
return new Promise((resolve, reject) => {
setTimeout(resolve(data), 4000);
})
}
function getUser(username){
let data = {
id:1,
username: 'superman',
gender: 'male'
}
return new Promise((resolve, reject) => {
if(username){
setTimeout(resolve(data), 2000);
}
else{
reject('err');
}
})
}
getUserName().then(username => {
return getUser();
})
.then(user => {
console.log(user);
})
.catch(err => {
console.log(err);
})
