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 流程控制常用的方法有 series
、parallel
、waterfall
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:多個任務依次執行,上一任務的輸出可做爲下一任務的輸入參數