[英]Wrapper function that conditionally returning promise or callback
async function wait(callback){
var awaited = await giveError();
return returner(awaited, callback)
}
function giveError(){throw new Error('oops')}
我的任務是在那里創建returner
函數,如果沒有回調,它將返回一個promise,如果確實存在,則調用該回調
如果returner
除了返回第一個參數外什么也不做,它將返回一個promise
async function returner(awaited, callback){
console.log('triggering returner')
if(!callback){
return awaited
} else {
console.log('there is a callback')
}
}
wait().then(console.log).catch(err=>{
console.log('correct error catching here for async \n\n')
})
// prints 'correct error catching here for async'
問題是,如果有回調,我很難捕捉到該錯誤(假設awaited
是一個承諾)
wait(function(err, val){
console.log('callback error handling', err, val)
})
async function returner(awaited, callback){
console.log('triggering returner')
if(!callback){
return awaited
} else {
awaited
.then(val=>{
callback(null, val)
})
.catch(err=>{
callback(err)
})
}
}
// gives UnhandledPromiseRejectionWarning: Error: oops
我有問題:
為什么“觸發返回者”從不打印?
awaited
諾言? 如果不是,是否有可能編寫returner
函數?
為什么“觸發返回者”從不打印?
因為如果等待正在等待的諾言, await
將表現為throw
。 因此,代碼在此處終止,並且錯誤冒出氣泡,永遠不會到達return returner(..)
。
等待諾言?
沒有承諾的解決價值。
我實際上會寫一個包裝異步函數本身並接受回調的函數:
const withCallback = fn => (...args) => {
const last = args[args.length - 1];
if(typeof last === "function") {
return fn(...args.slice(0, -1))
.then(res => last(null, res))
.catch(last);
} else {
return fn(.. args);
}
};
這樣,您可以將其編寫為:
const wait = withCallback(async function wait(){
var awaited = await giveError();
return "result";
});
這使您可以執行以下操作:
wait().then(/*...*/).catch(/*...*/)
// As well as
wait(function(error, result) { /*...*/ });
async
函數將始終返回Promise
。 如果要將函數的返回類型配置為根據參數而有所不同,則需要手動進行操作:
function foo(cb) { if (typeof cb !== "function") { return Promise.resolve("hello"); } else { return cb("hello"); } } foo(v => console.log(v)); foo().then(v => console.log(v));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.