在需要呼叫多次callback時,async await可改善callback hell的現象
而nodejs在8.x支援原生的async await,在設計callback api時,可設計成同時支援舊的callback style與新的promise style,這樣一來可以使api同時支援’async’ library與async/await語法
作法1:
function delay(ms, cb){
var func = delay;
if(cb === undefined){
//檢查是否有callback,如果沒有返回promise
return new Promise(function(resolve, reject){
func(ms, function(err, data){
if(err) return reject(err);
resolve(data);
});
});
}
setTimeout(function(){ cb(null, Date.now()); }, ms);
}
作法2: 參考: https://zaiste.net/node_js_functions_simultaneously_supporting_callbacks_promises/
function delay(ms, cb = function(){}){
var func = delay;
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve(Date.now());
cb(null, Date.now());
}, ms);
});
}
使用:
//callback用法
delay(2000, function(err, data){
if(err){
console.log('error', err);
} else {
console.log(data);
}
});
//promise then用法
delay(2000).then(data => console.log(data)).catch(err => console.log('error', err));
//async await用法,await要包在async function內
(async function(){
try{
var resp = await delay(2000); //resolve時才往下走
console.log(resp);
}catch(e){
console.log('error', e);
}
})();