我正在处理包含带有回调的异步函数的代码,即
async getData(options, callback) {
我真的想不出为什么有人会在异步函数中使用回调的原因。因此,我正在考虑对其进行重写以在没有回调的情况下返回Promise。
我在问这个问题只是为了确定。是否有充分的理由编写这样的代码(我不明白)。我不想冒犯我的同事,但同时,我不希望看到过于复杂的代码来检查回调是否未定义并返回该回调(并且在某些地方甚至基于此执行不同的逻辑)。
答案 0 :(得分:1)
这取决于回调的用途。
如果仅是报告该函数工作的异步完成,则没有理由这样做。async
函数以它们返回的承诺来做到这一点。
但是,如果出于不同的原因,它可能是有效的。例如,将数据从点A复制到点B的async
函数可以接受一个可选的回调,该回调以某种方式转换该数据的记录:async
函数从点A读取记录,并通过通过回调,并将结果写入B点;函数返回的诺言适用于整个操作。 (不是世界上最好的例子,您可以将其写为一对async
生成器,但是...)
最近我有理由写出这只奇特的鸭子:
function nextFrame(cb) {
return new Promise(resolve => {
requestAnimationFrame(() => {
cb();
resolve();
});
});
}
...以便我可以在async
函数中做到这一点:
await nextFrame(() => {/*...updates for frame here...*/});
我不能做到
await nextFrame();
// ...updates for frame here...
有两个原因(因为processing model意味着我的后续代码不会在框架之前运行,并且因为我不希望在其中进行所有的工作)我的async
函数,直到绘制框架之前的下一个await
。
此外,@ VLAZ在their comment中非常有用,如果某个API以前支持完成回调,而该函数之前未返回任何内容,则可以对其进行改进以返回promise,但仍接受回调。 MongoDB的一个客户端库执行了IIRC。