异步调用和回调之间有什么区别

Jud*_*han 27 asynchronous callback

我很难理解异步调用回调之间的区别.

我读过这篇讲授CallBacks的帖子,但没有一个答案说明它与异步调用的区别.

这是Callbacks = Lambda表达式吗?

回调是在不同的线程中运行的?

有人能用简单的英语解释这个吗?

pau*_*sm4 53

很简单,回调不一定是异步的.

http://docs.apigee.com/api-baas/asynchronous-vs-synchronous-calls

  1. 同步:

    如果API调用是同步的,则意味着代码执行将阻止(或等待)API调用在继续之前返回.这意味着,在API返回响应之前,您的应用程序将不会再执行,这可能会被用户视为应用程序中的延迟或性能滞后.然而,如果应用程序中的代码只有在收到API响应后才能正确执行,那么同步进行API调用会很有用.

  2. 异步:

    异步调用不会阻止(或等待)API调用从服务器返回.在程序中继续执行,当从服务器返回调用时,执行"回调"功能.

在Java,C和C#中,"回调"通常是同步的(相对于"主事件循环").

另一方面,在Javascript中,回调通常是异步的 - 你传递一个将被调用的函数......但是在调用回调之前,其他事件将继续被处理.

如果你不关心Javascript事件发生在哪个顺序 - 很棒.否则,在Javascript中管理异步行为的一个非常强大的机制是使用"promises":

http://www.html5rocks.com/en/tutorials/es6/promises/

PS:回答你的其他问题:

  1. 是的,回调可能是一个lambda - 但这不是一个要求.

    在Javascript中,几乎每个回调都将是一个"匿名函数"(基本上是"lambda表达式").

  2. 是的,可以从不同的线程调用回调 - 但这肯定不是必需的.

  3. 回调也可能(并经常)产生一个线程(从而使自己"异步").

'希望有所帮助

================================================== ==================

你好,我们又见面了:

问:@ paulsm4能否详细说明回调和异步调用在执行流程中的工作原理?这将非常有帮助

  1. 首先,我们需要就"回调"的定义达成一致.这是一个很好的:

    https://en.wikipedia.org/wiki/Callback_%28computer_programming%29

    在计算机编程中,回调是一段可执行代码,它作为参数传递给其他代码,期望在某个方便的时候回调(执行)参数.调用可以像在同步回调中一样立即执行,也可以在稍后的时间发生,就像在异步回调中一样.

  2. 我们还必须定义"同步"和"异步".基本上 - 如果回调在返回调用者之前完成所有工作,那么它就是"同步".如果它可以在调用后立即返回给调用者 - 并且调用者和回调可以并行工作 - 那么它就是"异步".

  3. 同步回调的问题是它们似乎"挂起".异步回调的问题是您可能失去对"排序"的控制 - 您不一定能保证在"B"之前出现"A".

  4. 回调的常见示例包括:

    a)按钮按下处理程序(每个不同的"按钮"将具有不同的"响应").这些通常被调用为"异步"(通过GUI的主事件循环).

    b)排序"比较"功能(因此常见的"sort()"函数可以处理不同的数据类型).这些通常是"同步"调用(由程序直接调用).

  5. 一个具体的例子:

    a)我有一个带有"print()"功能的"C"语言程序.

    b)"print()"旨在使用三个回调中的一个:"PrintHP()","PrintCanon()"和"PrintPDF()".

    c)"PrintPDF()"调用库以PDF格式呈现我的数据.它是同步的 - 在.pdf渲染完成之前,程序不会从"print()"返回.它通常很快,所以没有问题.

    d)我编写了"PrintHP()"和"PrintCanon()"来生成线程来对物理打印机进行I/O操作.创建线程后,"Print()"退出; 实际的"打印"与程序执行并行进行.这两个回调是"异步".

问:有道理吗?这有帮助吗?