207 votes

Quelle est la différence entre la programmation synchrone et asynchrone (dans node.js)

J'ai lu nodebegginer Et je suis tombé sur les deux morceaux de code.

La première:

    var result = database.query("SELECT * FROM hugetable");
    console.log("Hello World");

La seconde.

    database.query("SELECT * FROM hugetable", function(rows) {
       var result = rows;
    });
    console.log("Hello World");

Je reçois ce qu'ils sont supposés faire, ils interrogent la base de données pour récupérer la réponse à la requête. Et puis la console.log('Hello world').

Le premier est soi-disant code synchrone. Et le second est le code asynchrone.

La différence entre les deux morceaux est très vague pour moi. Ce serait la sortie?

Googler sur la programmation asynchrone ne m'a pas aidé non plus.

241voto

TheBronx Points 2218

La différence est que dans le premier exemple, le programme bloc dans la première ligne. La ligne suivante (console.log) devra attendre.

Dans le deuxième exemple, l' console.log sera exécutée ALORS que la requête est en cours de traitement. Qui est, la requête sera traitée dans le fond, tandis que votre programme est en train de faire d'autres choses, et une fois que les données de la requête est prêt, vous pourrez faire ce que vous voulez avec elle.

Donc, en résumé:

Le premier exemple de bloc, tandis que le second l'habitude.

La sortie des deux exemples suivants:

//example 1
var result = database.query("SELECT * FROM hugetable");
console.log("query finished");
console.log("Next line");


//example 2
database.query("SELECT * FROM hugetable", function(rows) {
    console.log("query finished");
});
console.log("Next line");

Serait:

  1. query finished
    Next line
  2. Next line
    query finished

82voto

skumar Points 3144

La différence entre ces deux approches est comme suit:

Synchrone façon: Il attend de chaque opération pour terminer, après qu'il exécute l'opération suivante. Pour votre requête: De la console.log() la commande ne sera pas exécutée jusqu'à ce que et à moins que la requête a fini de s'exécuter pour obtenir le résultat à partir de la Base de données.

Asynchrone: Il n'attend jamais pour chaque opération à effectuer, plutôt, il exécute toutes les opérations dans le premier ALLER seulement. Le résultat de chaque opération sera traitée une fois que le résultat est disponible. Pour votre requête: De la console.log() de la commande sera exécutée peu après la Base de données.Méthode Query (). Alors que la Base de données de la requête s'exécute en arrière-plan et les charges le résultat une fois qu'il est fini de récupérer les données.

Les cas d'utilisation

  1. Si vos activités ne sont pas de charges très lourdes, comme l'interrogation de données énorme de DB puis aller de l'avant avec la façon Synchrone sinon Asynchrone.

  2. Dans Asynchrone façon, vous pouvez montrer un indicateur de Progrès pour l'utilisateur, alors que dans le fond vous pouvez continuw avec votre poids lourd œuvres. C'est un scénario idéal pour les applications à interface graphique.

26voto

Martijn Points 6412

Ce serait de devenir un peu plus clair, si vous ajoutez une ligne à la fois des exemples:

var result = database.query("SELECT * FROM hugetable");
console.log(result.length);
console.log("Hello World");

La seconde:

database.query("SELECT * FROM hugetable", function(rows) {
   var result = rows;
   console.log(result.length);
});
console.log("Hello World");

Essayez d'exécuter ces, et vous remarquerez que la première (synchrone), par exemple, le résultat.la longueur sera imprimé AVANT le 'Bonjour le Monde' de ligne. Dans la seconde (asynchrone), par exemple, le résultat.longueur (le plus probable) être imprimé APRÈS le "Hello World" de ligne.

C'est parce que dans le deuxième exemple, l' database.query est exécuté de manière asynchrone dans le fond, et le script continue d'emblée avec le "Hello World". L' console.log(result.length) n'est exécuté que lorsque la requête de base de données est terminé.

6voto

related Points 349

Dans le cas synchrone, la commande console.log n'est pas exécutée tant que l'exécution de la requête SQL n'est pas terminée.

Dans le cas asynchrone, la commande console.log sera exécutée directement. Le résultat de la requête sera ensuite stocké par la fonction "callback" ultérieurement.

5voto

thebreiflabb Points 1004

La principale différence réside dans la programmation asynchrone, vous n'arrêtez pas l'exécution autrement. Vous pouvez continuer à exécuter un autre code pendant que la "demande" est en cours.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X