Promise和Async的相關用法

Promise

Promise最大的好處是在異步執行的流程中,把執行代碼和處理結果的代碼清晰地分離了:

串行執行三個promise對象,

job1.then(job2).then(job3).catch(handleError);

除了串行執行若干異步任務外,Promise還可以並行執行異步任務,all 、race。

1.Pomise.all的使用

Promise.all可以將多個Promise實例包裝成一個新的Promise實例。同時,成功和失敗的返回值是不同的,成功的時候返回的是一個結果數組,而失敗的時候則返回最先被reject失敗狀態的值。

let p1 = new Promise((resolve, reject) => {
  resolve('成功了')
})

let p2 = new Promise((resolve, reject) => {
  resolve('success')
})

let p3 = Promse.reject('失敗')

Promise.all([p1, p2]).then((result) => {
  console.log(result)               //['成功了', 'success']
}).catch((error) => {
  console.log(error)
})

Promise.all([p1,p3,p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)      // 失敗了,打出 '失敗'
})

2.Promise.race的使用

Promse.race就是賽跑的意思,意思就是說,Promise.race([p1, p2, p3])裏面哪個結果獲得的快,就返回那個結果,不管結果本身是成功狀態還是失敗狀態。

let p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success')
  },1000)
})

let p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('failed')
  }, 500)
})

Promise.race([p1, p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)  // 打開的是 'failed'
})

 

Async

Async 是一個流程控制工具包,提供了直接而強大的異步功能。基於JavaScript 爲 Node.js 設計,同時也可以直接在瀏覽器中使用。

Async 流程控制常用的方法有 seriesparallelwaterfall

1. Async.series(tasks,callback)

  • 用法
    series方法用於依次執行多個方法,一個方法執行完畢後纔會進入下 一方法,方法之間沒有數據傳遞

  • 參數

  • tasks:需要執行多個方法。tasks 可以以數組形式傳入,也可以以 object 對象形式傳入。每個方法都要一個回調方法

  • callback(err, result)
    * 作用:用於處理錯誤或進入下一方法。當發生錯誤時(即:err 參數存在時),其後的方法會跳過,錯誤被傳入最終回調方法中
    * 出錯處理方法:出措時,tasks 中拋出的錯誤將在此方法中捕獲,錯誤被傳入err參數
    * 不出錯處理方法:不出錯時,tasks 中回調結果將被寫入 results 參數中,以數據或對象形式提供

//以數組形式傳入需要執行的多個方法
       async.series([
         function(callback){
         callback(null, 'one'); 
       },
         function(callback){
        // 執行一些操作後,callback進入可選的最終回調方法
          callback(null, 'two');
       }
       ],
      // 可選的最終回調 
       function(err, results){
      // 當tasks中的任一方法發生錯誤,即回調形式爲callback('錯誤信息')時錯誤將被傳遞給err參數,未發生錯誤err參數爲空          
      // results中爲數組中兩個方法的結果數組:['one', 'two'] 
       });
 
      //以object對象形式傳入需要執行的多個方法
      async.series({
           one: function(callback){
            // 執行一些操作後,callback進入下一方法
            callback(null, 1);
            },
           two: function(callback){
           // 執行一些操作後,callback進入可選的最終回調方法
          callback(null, 2);
          }
     },
     function(err, results) {
     // 當tasks中的任一方法發生錯誤,即回調形式爲callback('錯誤信息')時,錯誤將被傳遞給err參數,未發生錯誤err參數爲空
     // results中爲數組中兩個方法的結果對象:{one: 1, two: 2} 
   });

2. Async.parallel(tasks,callback)

  • 用法
    parallel方法用於並行執行多個方法,所有傳入的方法都是立即執行,方法之間沒有數據傳遞。傳遞給最終callback的數組中的數據按照tasks中聲明的順序,而不是執行完成的順序。
  • 參數
  • tasks:需要執行多個方法。tasks可以以數組形式傳入,也可以以object對象形式傳入。每個方法都要一個回調方法
  • callback(err,result)
    • 作用:回調方法需要提供一個err參數或是result參數。當發生錯誤時 (即:err參數存在時),所有的方法停止執行,未執行完的方法將不會被傳遞至最終回調方法中
    • 出錯處理方法:出錯時,tasks中拋出的錯誤將在此方法中捕獲,錯誤被傳入err參數
    • 不出錯:不出錯時,tasks中回調結果將被寫入results參數中,以數據或對象形式提供。
//以數組形式傳入需要執行的多個方法
      async.parallel([
         function(callback){
         // 執行一些操作後,callback表示本方法執行完成
               callback(null, 'one');
         },
        function(callback){
        // 執行一些操作後,callback表示本方法執行完成
             callback(null, 'two');
       }
       ],
       // 可選的最終回調 
       function(err, results){
       // 當tasks中的任一方法發生錯誤,即回調形式爲callback('錯誤信息')時,錯誤將被傳遞給err參數,未發生錯誤err參數爲空
       // results中爲數組中兩個方法的結果數組:['one', 'two'] ,即使第二個方法先執行完成,其結果也是在第一個方法結果之後
});
 
     //以object對象形式傳入需要執行的多個方法
     async.parallel({
         one: function(callback){
         // 執行一些操作後,callback表示本方法執行完成
            callback(null, 1);
         },
         two: function(callback){
        // 執行一些操作後,callback表示本方法執行完成
        callback(null, 2);
      }
  },
     function(err, results) {
    // 當tasks中的任一方法發生錯誤,即回調形式爲callback('錯誤信息')時,錯誤將被傳遞給err參數,未發生錯誤err參數爲空
    // results中爲數組中兩個方法的結果對象:{one: 1, two: 2} 
});

3. Async.waterfall(tasks,callback)

  • 用法
    waterfall方法與series方法類似用於依次執行多個方法,一個方法執行完畢後纔會進入下一方法,不同與series方法的是,waterfall之間有數據傳遞。waterfall的多個方法只能以數組形式傳入,不支持object對象
  • 參數
  • tasks:需要執行多個方法。tasks只能以數組形式傳入。每個方法都要一個回調方法callback(err, result1, result2, ...),用於處理錯誤或進入下一方法。當發生錯誤時(即:err參數存在時),其後的方法會跳過,錯誤被傳入最終回調方法中。無錯誤時回調參數result1, result2……將做爲下一方法的輸入參數
  • callback(err,result)
  • 出錯處理方法:出錯時,tasks中拋出的錯誤將在此方法中捕獲,錯誤被傳入err參數
  • 不出錯:不出錯時,tasks中回調結果results爲最後一個方法的回調結果
async.waterfall([
    function(callback) {
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback) {
        // arg1 現在是 'one', arg2 現在是 'two' 
        callback(null, 'three');
    },
    function(arg1, callback) {
        // arg1 現在是 'three' 
        callback(null, 'done');
    }
], function (err, result) {
    //執行的任務中方法回調err參數時,將被傳遞至本方法的err參數
    // 參數result爲最後一個方法的回調結果'done'     
});

總結:

series:多個任務依次執行
parallel:多個任務併發執行
waterfall:多個任務依次執行,上一任務的輸出可做爲下一任務的輸入參數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章