Cosa determina quali funzioni Javascript stanno bloccando o non bloccano?

26

Ho fatto Javascript basato sul web (vanilla JS, jQuery, Backbone, ecc.) per alcuni anni e recentemente ho lavorato con Node.js. Mi ci è voluto un po 'per ottenere il blocco della programmazione "non bloccante", ma ora mi sono abituato a usare i callback per operazioni di I / O e quant'altro.

Comprendo che Javascript è a thread singolo per natura. Comprendo il concetto del nodo "coda degli eventi". Quello che NON capisco è ciò che determina se una singola operazione javascript è "bloccante" o "non bloccante". Come faccio a sapere su quali operazioni posso dipendere per produrre un output in modo sincrono da utilizzare nel codice successivo e su quali devo passare i callback in modo da poter elaborare l'output una volta completata l'operazione iniziale? C'è un elenco di funzioni Javascript da qualche parte che sono asincroni / non bloccanti e un elenco di quelli che sono sincroni / bloccanti? Che cosa impedisce alla mia app JavaScript di essere una condizione di competizione gigantesca?

So che le operazioni che richiedono molto tempo, come le operazioni di I / O in operazioni Node e AJAX sul Web, richiedono che siano asincrone e quindi utilizzino le richiamate, ma chi sta determinando ciò che si qualifica come "un lungo periodo"? Esiste una sorta di trigger all'interno di queste operazioni che li rimuove dalla normale "coda eventi"? In caso contrario, cosa li rende diversi dalle semplici operazioni come l'assegnazione di valori alle variabili o il looping attraverso gli array, a cui sembra che possiamo dipendere per finire in modo sincrono?

Forse non ci sto nemmeno pensando correttamente - sperando che qualcuno possa dirmi chiaramente. Grazie!

    
posta Sean 19.06.2013 - 20:30
fonte

4 risposte

13

In generale, qualsiasi funzione che fa networking o utilizza i timer per fare cose in un periodo di tempo sarà asincrona.

Se la funzione accetta una richiamata, è possibile vedere a cosa serve il callback e in genere sarà ovvio se sia asincrono o meno. Se la funzione non offre una richiamata, non ha modo di comunicare risultati asincroni, quindi probabilmente non è asincrona.

Non c'è modo di dirlo con certezza. Deve essere specificato nel doc per una funzione o ovvio dal modo in cui funziona l'interfaccia.

Le operazioni asincrone sono diverse sotto le copertine rispetto alle operazioni sincrone in quanto le operazioni asincrone hanno la nozione di impostare un'operazione, avviando l'operazione e quindi ricevendo una notifica in seguito di avanzamento, completamento o errori nell'operazione. L'iterazione di un array è un'operazione sincrona. Non ha nessuno di questi problemi. Il codice viene eseguito solo in modo sincrono. L'emissione di una chiamata Ajax consiste nel registrare una richiamata per le notifiche di stato, quindi avviare la chiamata ajax, quindi continuare a eseguire altro javascript e quindi qualche tempo dopo, la richiamata viene chiamata con una modifica di stato sulla chiamata ajax (ad esempio il completamento). / p>     

risposta data 19.06.2013 - 20:37
fonte
5

Da quello che ho capito, non ti stai chiedendo cosa tu dovrebbe fare in modo asincrono, ma come stabilire se una funzione è asincrona.

Controlla la documentazione. Seriamente, ecco a cosa serve Non indovinate quale funzione fa in base al suo nome o al suo contesto proprio così. Se non sei sicuro e hai accesso al suo codice sorgente, controlla quello.

Questo è l'unico modo completamente affidabile.

Ora per l'ipotesi.

  • Se accetta una richiamata o restituisce una promessa probabilmente è asincrona (ho visto eccezioni per quella regola)
  • Generalmente tutto ciò che è legato all'I / O in node.js e più in generale in JavaScript viene eseguito in modo asincrono (ho visto anche eccezioni a questa regola)
risposta data 19.06.2013 - 20:52
fonte
4

Poiché JavaScript è un singolo thread di tutti i blocchi di elaborazione finché non si verifica uno dei seguenti casi

1) L'esecuzione corrente richiede un servizio esterno come una richiesta di I / O o di rete o una richiesta del webworker

2) Una chiamata di funzione viene inserita in un timer da eseguire in un secondo momento

Non c'è una lista di funzioni di blocco / non blocco. Dovresti controllare la documentazione.

La tua app può incontrare una condizione di competizione se più servizi esterni hanno un blocco sul thread javascript e cercano di accedervi contemporaneamente. I moderni browser e il motore V8 gestiscono questo, ma è possibile che si verifichi questa condizione di gara se si utilizza PhoneGap e si scrivono app javascript per dispositivi mobili. Il supporto non è lì per gestire queste condizioni di gara.

In generale, supponi i blocchi di codice a meno che non ci sia un callback. E anche se c'è una richiamata, ciò non significa che non bloccherà.

    
risposta data 19.06.2013 - 20:52
fonte
-1

Anch'io sono nuovo su node.js (e JavaScript in generale) e non sono abituato a tanto codice asincrono. Volevo solo far notare che nel Panoramica del blocco contro non bloccanti su nodejs.org afferma che:

All of the I/O methods in the Node.js standard library provide asynchronous versions, which are non-blocking, and accept callback functions. Some methods also have blocking counterparts, which have names that end with Sync.

    
risposta data 23.07.2017 - 17:21
fonte

Leggi altre domande sui tag