gpt4 book ai didi

javascript - 有条件返回 Promise 或回调的包装函数

转载 作者:行者123 更新时间:2023-12-03 01:17:28 25 4
gpt4 key购买 nike

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 是一个 promise )

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 是一个 promise 吗?如果没有,是否可以编写 returner 函数?

最佳答案

why does 'triggering returner' never print?

因为如果等待的 Promise 被拒绝,await 的行为就会像 throw 一样。因此,代码在那里终止,并且错误不断冒出,return returner(..) 永远不会到达。

is awaited a promise?

不,它是 promise 的解析值。

<小时/>

我实际上会编写一个包装异步函数本身并接受回调的函数:

  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) { /*...*/ });

关于javascript - 有条件返回 Promise 或回调的包装函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51936995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com