2016-03-25 43 views
8

Sono un po 'confuso per capire la differenza tra chiamate asincrone e callback.Qual è la differenza tra chiamate asincrone e callback

Ho letto questo post che teach about CallBacks ma nessuna delle risposte risponde allo come differisce dalle chiamate asincrone.

È questo Callback = Lambda Expressions?

Le richiamate sono in esecuzione in una thread diversa?

Qualcuno può spiegare questo con semplice semplice inglese?

+1

in realtà una domanda molto buona. Non preoccuparti del fatto che il cervello dello stronzo ti annulli;) – paulsm4

risposta

15

Molto semplicemente, una richiamata non deve essere asincrona.

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

  1. sincrono:

    Se una chiamata API è sincrona, significa che l'esecuzione codice blocco (o attendere) per la chiamata API per restituire prima di continuare. Questo significa che finché l'API non restituisce una risposta, l'applicazione non verrà eseguita ulteriormente, che potrebbe essere percepita dall'utente come latenza o ritardo di prestazioni nella tua app. Effettuare una chiamata API in modo sincrono può essere utile, tuttavia, se ci fosse il codice nella tua app che verrà eseguita correttamente una volta ricevuta la risposta API.

  2. asincrono:

    chiamate asincrone non bloccare (o attendere) per la chiamata API per restituire dal server. L'esecuzione continua nel programma e quando la chiamata viene restituita dal server, viene eseguita una funzione di "richiamata".

In Java, C e C#, "callback" sono di solito sincrono (rispetto ad un "loop evento principale").

In Javascript, d'altra parte, i callback sono in genere asincroni - si passa una funzione che verrà invocata ... ma altri eventi continueranno a essere elaborati fino a quando non viene richiamata la richiamata.

Se non ti interessa quali eventi Javascript si verificano in quale ordine - grande. In caso contrario, un meccanismo molto potente per la gestione comportamento asincrono in Javascript è quello di utilizzare "promesse":

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

PS: per rispondere alle vostre domande:

  1. Sì, un callback può essere un lambda - ma non è un requisito.

    In Javascript, quasi ogni callback sarà una "funzione anonima" (in pratica una "espressione lambda").

  2. Sì, i callback possono essere richiamati da un thread diverso, ma non è certamente un requisito.

  3. I callback possono anche (e spesso lo fanno) generare un thread (rendendosi così "asincroni").

'Speranza che aiuta

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

Ciao, Anche in questo caso:

D: @ paulsm4 puoi per favore elaborare un esempio di come la callback e la chiamata asincrona funzionano nel flusso di esecuzione? Che sarà molto utile

  1. Per prima cosa dobbiamo concordare una definizione di "callback". Ecco una buona:

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

    Nella programmazione di computer, un callback è un pezzo di codice eseguibile che viene passato come argomento per altro codice, che dovrebbe richiamare (eseguire) l'argomento in un momento opportuno. L'invocazione può essere immediata come in una callback sincrona oppure in un momento successivo come in un callback asincrono .

  2. Dobbiamo anche definire "sincrono" e "asincrono". Fondamentalmente - se un callback fa tutto il lavoro prima di tornare al chiamante, è "sincrono". Se può tornare al chiamante immediatamente dopo che è stato chiamato - e il chiamante e il callback possono funzionare in parallelo - allora è "asincrono".

  3. Il problema con i callback sincroni è che possono apparire "bloccati". Il problema con i callback asincroni è che puoi perdere il controllo di "ordering" - non puoi necessariamente garantire che "A" si verifichi prima di "B".

  4. Esempi comuni di callback includono:

    a) un gestore di premere il tasto (ogni "pulsante" diversa avrà una "risposta" diversa). Questi sono solitamente invocati come "asincroni" (dal ciclo degli eventi principale della GUI).

    b) una sorta di funzione "confronta" (quindi una funzione comune "sort()" può gestire diversi tipi di dati). Questi sono di solito invocati "in modo sincrono" (chiamati direttamente dal tuo programma).

  5. Un esempio concreto:

    a) Ho un programma in linguaggio "C" con una funzione di "print()".

    b) "print()" è progettato per utilizzare uno dei tre callback: "PrintHP()", "PrintCanon()" e "PrintPDF()".

    c) "PrintPDF()" chiama una libreria per il rendering dei miei dati in PDF. È sincrono - il programma non ritorna da "print()" finché il rendering .pdf non è completo. Di solito va piuttosto veloce, quindi non c'è nessun problema.

    d) Ho codificato "PrintHP()" e "PrintCanon()" per generare i thread per eseguire l'I/O sulla stampante fisica. "Print()" esce non appena viene creato il thread; l'effettiva "stampa" procede parallelamente all'esecuzione del programma. Questi due callback sono "asincroni".

D: Ha senso? Questo aiuta?

+0

Sei sinonimo di "callback" con "Asincrono", che semplicemente non è corretto. Qualunque cosa questi documenti "apigee" menzionino, non è assolutamente indipendente dalla lingua. Non che la domanda possa essere risolta correttamente in modo indipendente dal linguaggio. Ogni lingua che ho visto ha il proprio sapore di callback e asincrono:/ – Vogel612

+0

Vogel612 - Sto dicendo esplicitamente che un callback NON è equivalente a "asincrono". I * AM * affermando che in Javascript, * si * scriveranno molte funzioni di callback e tali funzioni saranno normalmente invocate in modo asincrono. Da qui la necessità di "promesse" in Javascript. – paulsm4

+0

@ paulsm4 è possibile elaborare con un esempio come funziona la richiamata e la chiamata asincrona nel flusso di esecuzione? ** Questo sarà molto utile ** –

0

Sono abbastanza simili ma questo è solo mho.

Quando si utilizzano i callback, si specifica quale metodo deve essere richiamato e si fa affidamento sui metodi chiamati per richiamare. È possibile specificare la richiamata per terminare ovunque e non è garantito il richiamo.

Nella programmazione asincrona, lo stack di chiamata deve svolgersi nella posizione di partenza, proprio come nella normale programmazione sincrona.

Avvertenza: sto pensando specificamente al C# in attesa di funzionalità in quanto vi sono altre tecniche asincrone.

+0

Ti piacerebbe delineare perché hai sentito questo bisogno di un voto basso? – user1763100

+0

ecco un upvote;) – paulsm4

Problemi correlati