带回调的异步函数

问题描述 投票:0回答:1

我正在处理包含有回调的异步函数的代码,也就是说,在一个异步函数中使用回调。

async getData(options, callback) {

我实在想不出为什么有人会在一个异步函数中使用回调。所以我在考虑重写成不使用回调来返回Promise。

我问这个问题只是为了确定一下。有没有一个合理的理由来写这样的代码(我不明白)。我不想得罪我的同事,但同时,我也不喜欢看到过于复杂的代码,检查回调是否不是未定义的,然后返回回调(在某些地方甚至会基于此做不同的逻辑)。

javascript es6-promise
1个回答
1
投票

这要看回调的目的是什么。

如果只是为了报告函数工作的异步完成,那就没有理由了。async 函数通过返回的承诺来实现。

但如果是为了一个 不同 原因,它可以是有效的。例如,一个 async 将数据从A点复制到B点的函数可能会接受一个可选的回调,以某种方式转换该数据的记录。这个 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...

有几个原因(因为 加工模式 意味着我的后续代码不会在框架之前运行,而且因为我不想让 在我之后的工作中 async 功能,直到下一次 await 在画框之前)。)


此外,@VLAZ在《中国的未来》中提出了一个非常好的观点。其评论如果一个API之前支持回调完成,而函数之前没有返回任何东西,它可以被改造成返回一个承诺,但仍然接受回调。MongoDB的一个客户端库就做到了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.