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

时间:2016-03-25 04:21:43

标签: asynchronous callback

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

我读过这些帖子teach about CallBacks,但没有一个答案解决与异步电话的区别

这是回调 = Lambda表达式吗?

回调是在另一个线程中运行的吗?

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

3 个答案:

答案 0 :(得分:44)

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

  

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

     
      
  1. 同步:

         

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

  2.   
  3. 异步:

         

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

  4.   

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

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

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

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

PS: 要回答您的其他问题:

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

    在Javascript中,几乎每个回调都是“匿名函数”(基本上是“lambda表达式”)。

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

  3. 回调也可能(通常会)生成一个线程(从而使自己“异步”)。

  4. '希望有所帮助

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

    嗨,再次:

      问:@ 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()”退出;实际的“打印”与程序执行并行进行。这两个回调是“异步”。

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

答案 1 :(得分:1)

它们非常相似,但这只是mho。

当您使用回调时,您指定应该重新调用哪种方法,并且依赖于您调用的方法来回叫。你可以指定你的回叫最终到达任何地方,但你不能保证回叫。

在异步编程中,调用堆栈应该展开到起始位置,就像在正常的同步编程中一样。

警告:我特别想到C#等待功能,因为还有其他异步技术。

答案 2 :(得分:1)

调用是同步的:它在调用完成后将控制权返回给调用者。
调用是异步的。否则。