Javascript 有条件返回承诺或回调的包装函数
我的任务是在那里创建returner函数,如果没有回调,它将返回一个承诺,如果回调确实存在,则调用它 若returner只返回其第一个参数,那个么它将根据需要返回一个承诺Javascript 有条件返回承诺或回调的包装函数,javascript,async-await,Javascript,Async Await,我的任务是在那里创建returner函数,如果没有回调,它将返回一个承诺,如果回调确实存在,则调用它 若returner只返回其第一个参数,那个么它将根据需要返回一个承诺 async function wait(callback){ var awaited = await giveError(); return returner(awaited, callback) } function giveError(){throw new Error('oops')} 问题是,如果有一个假
async function wait(callback){
var awaited = await giveError();
return returner(awaited, callback)
}
function giveError(){throw new Error('oops')}
问题是,如果有一个假设等待就是承诺的回调,我很难捕捉到错误
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'
我有问题:
为什么“触发返回者”从不打印
等待的是承诺吗?如果没有,是否可以编写returner函数?异步函数将始终返回承诺。如果要根据参数将函数的返回类型配置为不同,则需要手动执行以下操作:
函数foocb{
如果cb的类型!==函数{
返回Promise.hello;
}否则{
返回cbhello;
}
}
foov=>console.logv;
foo.thenv=>console.logv;
为什么“触发返回者”从不打印
因为等待会表现得像扔掉等待拒绝的承诺。因此,代码在那里终止,错误冒出来,返回者。。永远也达不到
等待的是承诺吗
不,这是承诺的确定价值
实际上,我会编写一个函数来包装异步函数本身并接受回调:
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
这样,您可以将其写成:
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";
});
async将始终返回承诺。您不能在返回程序中执行此操作。在那个阶段已经太迟了,因为由于异步,wait总是会返回一个承诺。你必须等一等
wait().then(/*...*/).catch(/*...*/)
// As well as
wait(function(error, result) { /*...*/ });