1. 程式人生 > >nodejs漸入佳境[14]-promise物件處理非同步

nodejs漸入佳境[14]-promise物件處理非同步

Promise

promise是nodejs的物件,用於處理非同步的同步操作。
new Promsie新建一個promise物件,兩個引數(resolve,reject)是兩個函式。
當呼叫resolve意味著操作成功。
當呼叫reject意味著操作失敗。

resolve和reject都只會執行一次。

then 函式會在promise執行完畢之後呼叫。
第一個引數回撥函式會在resolve成功後呼叫,第二個回撥函式會在reject觸發後呼叫。

resolve操作成功

1
2
3
4
5
6
7
8
9
10
11
12
var somePromise = new Promise((resolve,reject
)=>
{

 setTimeout(()=>{
     resolve('hey it works');
 },2500);

});

somePromise.then((message)=>{
 console.log('Success',message);
},(errorMessage)=>{
 console.log('Error:',errorMessage);
});

打印出hey it works

reject操作失敗

1
2
3
4
5
6
7
8
9
10
11
12
var
somePromise = new Promise((resolve,reject)=>{

 setTimeout(()=>{
     reject('ai it is error');
 },2500);

});

somePromise.then((message)=>{
 console.log('Success',message);
},(errorMessage)=>{
 console.log('Error:',errorMessage);
});

打印出Error: ai it is error

複雜promise

帶引數並且多重then函式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var asyncAdd = (a,b)=>{
   return new Promise((resolve,reject)=>{
       setTimeout(()=>{
         if(typeof a==='number' && typeof b==='number'){
           resolve(a+b);
         }else{
           reject('Argument must be number');
         }
       });
   });
};

asyncAdd(5,7).then((res)=>{
 console.log('Result',res);
 return asyncAdd(res,'33');
},(errorMessage)=>{
 console.log(errorMessage);
}).then((res)=>{
 console.log('should be 45',res);
},(errorMessage)=>{
 console.log(errorMessage);
});

執行結果:

1
2
3
Result 12
Argument must be number
Error: ai it is error

多重then特性

在asyncAdd(5,‘7’)函式reject失敗後,第二個then仍然呼叫的是第一個回撥函式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var asyncAdd = (a,b)=>{
   return new Promise((resolve,reject)=>{
       setTimeout(()=>{
         if(typeof a==='number' && typeof b==='number'){
           resolve(a+b);
         }else{
           reject('Argument must be number');
         }
       });
   });
};

asyncAdd(5,'7').then((res)=>{
 console.log('Result',res);
 return asyncAdd(res,'33');
},(errorMessage)=>{
 console.log(errorMessage);
}).then((res)=>{
 console.log('should be 45',res);
},(errorMessage)=>{
 console.log(errorMessage);
});

結果為:

1
2
3
Argument must be number
should be 45 undefined
Error: ai it is error

image.png