Cosa determina quali funzioni Javascript stanno bloccando o non bloccando?


27

Faccio Javascript basato sul web (vaniglia JS, jQuery, Backbone, ecc.) Da alcuni anni ormai e recentemente ho lavorato un po 'con Node.js. Mi ci è voluto un po 'per capire la programmazione "non bloccante", ma ora mi sono abituato a usare i callback per operazioni di IO e quant'altro.

Capisco che Javascript è a thread singolo per natura. Comprendo il concetto di "coda eventi" del nodo. Ciò che NON capisco è ciò che determina se una singola operazione javascript è "bloccante" rispetto a "non bloccante". Come faccio a sapere da quali operazioni posso fare affidamento per produrre un output in modo sincrono da utilizzare in un codice successivo, e quali a cui dovrò passare i callback per poter elaborare l'output al termine dell'operazione iniziale? Esiste un elenco di funzioni Javascript asincrone / non bloccanti e un elenco di funzioni sincrone / bloccanti? Cosa impedisce alla mia app Javascript di essere una condizione di gara gigantesca?

So che le operazioni che richiedono molto tempo, come le operazioni di I / O nelle operazioni Nodo e AJAX sul Web, richiedono che siano asincrone e quindi utilizzano i callback - ma chi sta determinando ciò che si qualifica come "un lungo tempo"? Esiste una sorta di trigger all'interno di queste operazioni che li rimuove dalla normale "coda degli eventi"? In caso contrario, cosa li rende diversi dalle semplici operazioni come l'assegnazione di valori alle variabili o il looping di matrici, da cui sembra che possiamo dipendere per terminare in modo sincrono?

Forse non ci sto nemmeno pensando correttamente - sperando che qualcuno mi possa mettere in chiaro. Grazie!


questo è qualcosa che ho trovato davvero utile, anche se la tua risposta alla tua domanda è che devi controllare la documentazione per scoprire se i metodi sono asincroni.
Anastasios Andronidis,

Risposte:


13

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

Se la funzione accetta un callback, puoi vedere a cosa serve il callback e di solito sarà ovvio se è asincrono o meno. Se la funzione non offre un callback, non ha modo di comunicare risultati asincroni, quindi probabilmente non è asincrona.

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

Le operazioni asincrone sono diverse sotto le coperture rispetto alle operazioni sincrone in quanto le operazioni asincrone hanno l'idea di impostare un'operazione, avviare l'operazione e quindi ricevere 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 funziona solo in modo sincrono. L'emissione di una chiamata ajax consiste nella registrazione di una richiamata per le notifiche di stato, quindi nell'avvio della chiamata ajax, quindi nella prosecuzione dell'esecuzione di altri javascript e, in seguito, dopo qualche tempo, la richiamata viene chiamata con una modifica dello stato nella chiamata ajax (come il completamento).


1
Come nota aggiuntiva, alcune funzioni Javascript sono sia bloccanti che non bloccanti, a seconda dei loro parametri. Ad esempio, XMLHttpRequest.openha un asyncparametro booleano che controlla se la chiamata successiva a sendè asincrona.
Brian,

Non ho trovato utile questa risposta e, in generale, ho spiegato.
Mehdi Raash,

@MehdiRaash - La risposta è che lo capisci dalla documentazione o dall'interfaccia. Non c'è altro modo. Questo è ciò che dice. Non sono sicuro di cos'altro ti aspettavi. Non esiste una risposta al proiettile magico.
jfriend00,

6

Da quello che ho capito che non stai chiedendo su ciò che si dovrebbe fare asincrona, ma come dire se una funzione è asincrona.

Controlli la documentazione. Scherzi a parte - questo è quello che serve. Non indovinate cosa fa una funzione in base al suo nome o al suo contesto proprio così. Se non sei sicuro e hai accesso al suo codice sorgente, lo controlli.

Questo è l'unico modo completamente affidabile.

Ora per indovinare.

  • Se accetta un callback o restituisce una promessa è probabilmente asincrono (ho visto eccezioni per quella regola)
  • Generalmente tutto ciò che è correlato all'I / O in node.js e più in generale in JavaScript viene fatto in modo asincrono (ho visto anche eccezioni a quella regola)

4

Poiché JavaScript è a thread singolo tutti i blocchi di elaborazione fino a quando si verifica una delle seguenti condizioni

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

2) Una chiamata di funzione viene impostata su un timer per essere eseguita in un secondo momento

Non esiste un elenco 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 provano ad accedervi contemporaneamente. I browser moderni e il motore V8 gestiscono questo, ma potresti riscontrare questa condizione di competizione se usi phonegap e scrivi app javascript per dispositivi mobili. Il supporto non è lì per gestire queste condizioni di gara.

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


-1

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

Tutti i metodi I / O nella libreria standard Node.js forniscono versioni asincrone, che non sono bloccanti, e accettano funzioni di callback. Alcuni metodi hanno anche controparti bloccanti, che hanno nomi che terminano con Sync.


1
come risponde a questa domanda? Vedi Come rispondere
moscerino il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.