带回调的异步功能

时间:2020-06-04 15:12:38

标签: javascript es6-promise

我正在处理包含带有回调的异步函数的代码,即

async getData(options, callback) {

我真的想不出为什么有人会在异步函数中使用回调的原因。因此,我正在考虑对其进行重写以在没有回调的情况下返回Promise。

我在问这个问题只是为了确定。是否有充分的理由编写这样的代码(我不明白)。我不想冒犯我的同事,但同时,我不希望看到过于复杂的代码来检查回调是否未定义并返回该回调(并且在某些地方甚至基于此执行不同的逻辑)。

1 个答案:

答案 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。