1. 程式人生 > >es6 入坑筆記(四)---非同步處理

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