我很难理解异步调用和回调之间的区别。
我读过这些帖子teach about CallBacks,但没有一个答案解决与异步电话的区别。
这是回调 = Lambda表达式吗?
回调是在另一个线程中运行的吗?
有人能用简单的英语解释这个吗?
答案 0 :(得分:44)
很简单,回调不一定是异步的。
http://docs.apigee.com/api-baas/asynchronous-vs-synchronous-calls
同步:
如果API调用是同步的,则意味着代码执行将会 阻止(或等待)API调用在继续之前返回。这个 意味着在API,您的应用程序返回响应之前 将不再执行,用户可以将其视为 应用中的延迟或性能滞后。进行API调用 然而,同步可能是有益的,如果您的应用程序中有代码 只有在收到API响应后才能正常执行。
- 醇>
异步:
异步调用不会阻止(或等待)API调用返回 从服务器。在你的程序中继续执行,当时 调用从服务器返回,执行“回调”功能。
在Java,C和C#中,“回调”通常是同步的(相对于“主事件循环”)。
另一方面,在Javascript中,回调通常是异步 - 你传递一个将被调用的函数......但是其他事件将继续被处理,直到调用回调为止。
如果你不关心Javascript事件发生在哪个顺序 - 很棒。否则,在Javascript中管理异步行为的一个非常强大的机制是使用“promises”:
http://www.html5rocks.com/en/tutorials/es6/promises/
PS: 要回答您的其他问题:
是的,回调可能是一个lambda - 但这不是一个要求。
在Javascript中,几乎每个回调都是“匿名函数”(基本上是“lambda表达式”)。
是的,可以从不同的线程调用回调 - 但这肯定不是必需的。
回调也可能(通常会)生成一个线程(从而使自己“异步”)。
'希望有所帮助
=============================================== =====================
嗨,再次:
问:@ paulsm4请您详细说明一下如何回调 和异步调用在执行流程中工作?那将是 非常有帮助
首先,我们需要就“回调”的定义达成一致。这是一个很好的:
https://en.wikipedia.org/wiki/Callback_%28computer_programming%29
在计算机编程中,回调是一段可执行代码 作为参数传递给其他代码,预计会回调 (执行)在某个方便时间的参数。调用可能是 在同步回调中立即执行,或者可能在稍后执行 时间与异步回调相同。
我们还必须定义“同步”和“异步”。基本上 - 如果回调在返回调用者之前完成所有工作,那么它就是“同步”。如果它可以在调用后立即返回调用者 - 并且调用者和回调可以并行工作 - 那么它就是“异步”。
同步回调的问题是它们似乎“挂起”。异步回调的问题是您可能失去对“排序”的控制 - 您不一定能保证在“B”之前出现“A”。
回调的常见示例包括:
a)按钮按下处理程序(每个不同的“按钮”将具有不同的“响应”)。这些通常被调用为“异步”(通过GUI的主事件循环)。
b)排序“比较”功能(因此常见的“sort()”函数可以处理不同的数据类型)。这些通常是“同步”调用的(由程序直接调用)。
一个具体的例子:
a)我有一个带有“print()”功能的“C”语言程序。
b)“print()”旨在使用三种回调之一:“PrintHP()”,“PrintCanon()”和“PrintPDF()”。
c)“PrintPDF()”调用库以PDF格式呈现我的数据。它是同步的 - 在.pdf渲染完成之前,程序不会从“print()”返回。它通常很快,所以没有问题。
d)我编写了“PrintHP()”和“PrintCanon()”来生成线程来对物理打印机进行I / O操作。创建线程后,“Print()”退出;实际的“打印”与程序执行并行进行。这两个回调是“异步”。
答案 1 :(得分:1)
它们非常相似,但这只是mho。
当您使用回调时,您指定应该重新调用哪种方法,并且依赖于您调用的方法来回叫。你可以指定你的回叫最终到达任何地方,但你不能保证回叫。
在异步编程中,调用堆栈应该展开到起始位置,就像在正常的同步编程中一样。
警告:我特别想到C#等待功能,因为还有其他异步技术。
答案 2 :(得分:1)
调用是同步的:它在调用完成后将控制权返回给调用者。
调用是异步的。否则。