es6 入坑筆記(四)---非同步處理
promise
用於js的非同步處理
形式:
1.申明一個promise的物件
let p = new Promise(function(成功時的引數,失敗時的引數){
if(。。。。){
成功時的引數(成功時想傳的值);
}else{
失敗時的引數(失敗時想傳的值);
}
});
呼叫then方法
p.then(
//第一個為成功時呼叫的回撥函式
(成功時想傳的值)=>(。。。),
/第二個為失敗時呼叫的回撥函式
(失敗時想傳的值)=>(。。。),
);
eg:
let a=1; let p = new Promise(function(r,rej){ if(a == 1){ r (2**3); }else{ rej("失敗"); } }); p.then( (res)=>(console.log(res)),//輸出8 (fail)=>(console.log(fail)) );
then的另一種形式(推薦)
p.then(
(res)=>(console.log(res))
).catch((fail)=>(console.log(fail)));
用catch 來捕捉錯誤時回撥
Promise.resolve(引數);
將引數轉化為一個promise物件,resolve狀態,成功狀態
eg:
Promise.resolve('aaa');
等價於
new Promise((suc)=>(
suc('aaa');
));
Promise.reject(引數);
將引數轉化為一個promise物件,reject狀態,失敗狀態
Promise.all([p1,p2,p3...]);
將一堆promise物件扔進一個數組內,打包成一個promise物件
只有陣列內所有的狀態都為成功狀態時Promise.all才處於成功狀態
Promise.race([p1,p2,p3...]);
將一堆promise物件扔進一個數組內,打包成一個promise物件
只要陣列內有一個元素的狀態為成功狀態時Promise.race處於成功狀態
then的連續呼叫
let a=1;
let b=1;
new Promise((suc,fail)=>{
setTimeout(() =>{
if(a==1){
suc('登陸成功');
}else{
fail('登陸失敗!!!');
}
},1000);
}).then((res) => {
console.log("成功登陸,開始獲取使用者資訊!");
return new Promise((suc,fail) =>(
setTimeout(() =>{
if(b==1){
suc({
name:"zjj",
age:18,
sex:"man"
});
}else{
fail('獲取失敗!!!');
}
},1000)))
}).then((res)=>{
console.log(res);
}).catch(
(fail)=>{
console.log(fail);
}
);