2016-03-25 78 views
8

我有點困惑,要了解異步調用回調之間的區別。異步調用和回調有什麼區別

我看了這篇文章,其中teach about CallBacks但沒有答案地址它與異步調用有什麼不同。

是這樣的回調 = Lambda表達式

回調運行在不同的線程?

任何人都可以用簡單的英語解釋這個嗎?

+1

其實是一個很好的問題。不要緊張的大腦大腦標記你;) – paulsm4

回答

15

很簡單,回調不需要是異步的。

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

  1. 同步:

    如果API調用是同步的,這意味着代碼執行將 塊(或等待)的API調用來繼續之前返回。這個 意味着,除非API返回響應,否則您的應用程序 將不會再執行任何操作,用戶可能會認爲您的應用程序的延遲或性能延遲爲 。但是,如果應用程序 中的代碼僅在接收到API響應後才能正確執行,則同步製作API調用 可能會有所幫助。

  2. 異步:

    異步調用不會阻止(或等待)API調用從服務器返回 。程序中的執行繼續進行,當服務器返回 調用時,將執行「回調」功能。

在Java,C和C#, 「回調」 通常是同步的(相對於 「主事件循環」)。

在Javascript中,另一方面,回調通常是異步 - 你傳遞一個函數,將被調用...但其他事件將繼續處理,直到回調被調用。

如果你不關心Javascript事件以什麼順序發生 - 很好。否則,在Javascript管理異步行爲的一個非常強大的機制就是用「承諾」:

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

PS: 要回答你的其他問題:

  1. 是,回調可能拉姆達 - 但這不是必需的。

    在Javascript中,幾乎每個回調將是一個「匿名函數」(基本上是一個「lambda表達式」)。

  2. 是的,回調可能會從不同的線程調用 - 但它肯定不是一個要求。

  3. 回調也可能(也常常是)產卵一個線程(從而使自己「異步」)。

「希望幫助

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

嗨,還是那句話:

問:@請問paulsm4,請詳細說明回調函數 和異步調用在執行流程中的工作原理。這將是 很大幫助

  1. 首先,我們需要對「回調」的定義達成一致。這裏有一個很好的一個:

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

    在計算機編程中,回調是一段可執行代碼, 被作爲參數傳遞給其他代碼,預計回調 通過(執行)在某個方便的時候這個論點。調用可以是 ,如同步回調中那樣,或者可能在 時間發生,如在異步回調中那樣。

  2. 我們還必須定義「同步」和「異步」。基本上 - 如果一個回調函數在返回調用者之前完成了工作,它就是「同步的」。如果它可以在被調用後立即返回給調用者 - 並且調用者和回調可以並行工作 - 那麼它是「異步的」。

  3. 同步回調的問題是它們可能會「掛起」。異步回調的問題是你可能失去對「排序」的控制 - 你不一定能保證「A」會在「B」之前發生。

  4. 回調的常見實例包括:

    一個)按鈕按壓處理程序(每個不同的「按鈕」將具有不同的「響應」)。這些通常被調用「asynchronousy」(通過GUI的主事件循環)。 b)一個「比較」函數的排序(所以一個普通的「sort()」函數可以處理不同的數據類型)。這些通常是「同步」調用的(由你的程序直接調用)。

  5. 一個具體的例子:

    一個)我有 「打印()」 功能的 「C」 語言程序。b)「print()」被設計爲使用三個回調中的一個:「PrintHP()」,「PrintCanon()」和「PrintPDF()」。

    c)「PrintPDF()」調用庫來呈現PDF中的數據。它是同步的 - 程序不會從「print()」返回,直到.pdf呈現完成。它通常很快,所以沒有問題。 d)我編寫了「PrintHP()」和「PrintCanon()」來產生線程來執行到物理打印機的I/O。一旦創建線程,「Print()」將立即退出;實際的「打印」與程序執行並行進行。這兩個回調是「異步」的。

問:有意義嗎?這有幫助嗎?

+0

你是「回調」與「異步」的代名詞,這是不正確的。無論這些「apigee」文檔如何提及,它絕對不是語言不可知的。並不是說這個問題可以用與語言無關的方式正確回答。我看過的每種語言都有自己的回調和異步風格:/ – Vogel612

+0

Vogel612 - 我明確表示回調不等於「異步」。我* AM *說,在Javascript中,你將會寫很多回調函數,而這些函數通常會被異步地調用。因此需要Javascript中的「承諾」。 – paulsm4

+0

@ paulsm4請您詳細說明回調和異步調用在執行流程中的工作原理嗎? **這將是非常有幫助的** –

0

他們很相似,但這只是mho。

當您使用回調函數時,您指定應該重新調用哪種方法,並且您依賴於調用回調函數的方法。您可以指定回電到最後結束,並且不保證被回叫。

在異步編程中,調用堆棧應該展開到開始位置,就像在正常的同步編程中一樣。

警告:我特別想到C#等待功能,因爲有其他異步技術。

+0

你想知道爲什麼你覺得這需要一個投票嗎? – user1763100

+0

這裏是一個upvote;) – paulsm4