Callback與Promise基本使用方式

Callback與Promise基本使用方式
 

先看以下Callback的程式碼

const funcA=function(callback){
   var i=Math.random()+1;
   setTimeout(() => {
       console.log('A');
       if(typeof callback==='function'){
           callback();
       }
   }, i*1000);
};
const funcB=function(){
   var i=Math.random()+1;
   setTimeout(() => {
       console.log('B');
   }, i*1000);
};
funcA(funcB());

JS是非同步的特性,當同時呼叫兩個函式並無法預期誰會先出現,所以在過去(ES6之前)

普遍做法會把後續要做的事情透過參數傳給第一個函式(呼叫funcA函式並將funcB當成參數),等第一個函式執行後才呼叫第二個函式,但是這作法當回呼函式變多時候,容易形成Callback Hell(回呼地獄),為了解決這個難維護又不好閱讀的Callback Hell,從ES6開始新增了一個Promise的物件,Promise基本宣告方式如下

let myPromise=new Promise((resolve,reject)=>{...code});
//resolve代表成功後的結果,reject代表失敗的結果
接下來改寫上面Callback的程式碼

function funcA(){
   return new Promise((resolve,reject)=>{
       setTimeout(() => {
           console.log('A');
           resolve('A');
       }, 1000);
   })
}
function funcB(){
   return new Promise((resolve,reject)=>{
       setTimeout(() => {
           console.log('B');
           resolve('B');
       }, 1000);
   });
}
funcA().then(funcB);//呼叫funcA,之後得到resolve就執行funcB


Promise物件的幾種狀態

pending:進行中,狀態是未知

fulfilled:狀態是成功,對應的回呼函式是resolve

rejected:狀態是失敗,對應的回呼函式是reject