什么时候使用回调函数?

问题描述 投票:8回答:3

什么时候使用回调函数?我知道它们是如何工作的,我见过它们的使用,我自己也多次使用过它们。

一个C语言世界的例子是 libcurl 它的数据检索依赖于回调。

一个相反的例子是OpenSSL:在我使用过的地方,我使用的是out参数。

ret = somefunc(&target_value);
if(ret != 0)
    //error case

我想知道什么时候该用哪个?回调是不是只对异步的东西有用?我目前正在设计我的应用程序的API,我想知道是使用回调还是只使用out参数。底下它将使用libcurl和OpenSSL作为它构建的主要库,"返回 "的参数是一个OpenSSL数据类型。

我看不出回调比只返回有什么好处。只有当我想以任何方式处理数据而不是仅仅返回时,这才有用吗?但是我可以处理返回的数据。两者的区别在哪里?

c callback
3个回答
7
投票

在最简单的情况下,这两种方法是等同的。但如果回调可以在数据到达时被多次调用以处理数据,那么回调方法就提供了更大的灵活性,而且这种灵活性并不限于异步用例。

libcurl就是一个很好的例子:它提供了一个API,允许为所有新到达的数据指定一个回调。另一种选择,就像你所介绍的那样,是只用 归位. 但是返回它--如何返回?如果数据被收集到一个内存缓冲区,缓冲区可能会非常大,而调用者可能只想把它保存到一个文件中。如果数据被保存到一个文件中,其名称被返回给调用者,如果调用者实际上只想把数据存储在内存中,可能会招致不必要的IO。如果调用者想在流的时候处理天数,比如说计算一个校验和,而根本不需要存储,那么这两种方法都是次优的。

回调方法允许调用者决定如何处理基本的数据块或将其组装成一个更大的整体。


4
投票

回调对于异步通知很有用。 当你在某个API中注册一个回调时,你期望当某个事件发生时,该回调会被运行。 同样,你也可以将它们作为数据处理管道中的一个中间步骤(如果你熟悉录音行业的话,类似于 "插入")。

所以,总结一下,这是我遇到的或实现回调方案的两个主要范式。

  1. 当数据到达或事件发生时,我会告诉你,你可以根据自己的需要使用它。
  2. 在我处理一些数据之前,我会给你修改的机会。

1
投票

如果可以立即返回值,那么是的,不需要回调。 正如你所猜测的那样,回调在以下情况下是有用的:当一个值 不能 无论什么原因,都会被立即返回(也许只是一个长期运行的操作,最好异步执行)。

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