Comment Promises est-elle implémentée en Javascript sans threads

Récemment, j'ai vu le concept de Promises implémenté dans AngularJS et JQuery.

J'ai vu la mise en œuvre d'un Futures en Java comme dans le code ci-dessous, mais cela nécessite que le concept de pools de threads soit présent dans le langage / la plate-forme. Cependant, il n'existe pas de tel concept de filetage en Javascript. Comment promis en version JavaScript est-il alors implémenté?

public class Futures1 { private static final ExecutorService pool = Executors .newFixedThreadPool(10); public static void main(String[] args) { Future<String> contentsFuture = null; try { contentsFuture = startDownloading(new URL("http://www.example.com")); } catch (MalformedURLException e) { e.printStackTrace(); } // other computation try { final String contents = contentsFuture.get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } public static Future<String> startDownloading(final URL url) { return pool.submit(new Callable<String>() { @Override public String call() throws Exception { try (InputStream input = url.openStream()) { return IOUtils.toString(input, StandardCharsets.UTF_8); } } }); } } 

Les promesses ont été inventées pour aider à gérer les opérations asynchrones et les promesses ne nécessitent pas de threads pour ce faire. Ce sont des objets qui fournissent essentiellement la comptabilité pour les opérations asynchrones – en gardant les drapeaux d'état, les valeurs de résultat et les auditeurs pour une transition d'état. Ce sont toutes les choses qui peuvent être facilement réalisées avec un Javascript simple threadé régulier.

Ainsi, tant que vous avez des opérations asynchrones (cependant, ces opérations sont implémentées), vous pouvez bénéficier des promesses et ne pas avoir besoin de threads pour les implémenter.

Ce que vous dites que vous voyez dans votre code Java, c'est un code qui aide à exécuter des tâches régulières dans un thread distinct (pour donner aux opérations synchrones un comportement de type asynchrone). Ce n'est pas ce que les promesses font. Donc, si vous avez déjà des opérations asynchrones dans votre environnement, vous n'auriez pas besoin de ce type de code afin d'utiliser des promesses.

Des exemples de choses asynchrones en Javascript sont à peu près tout ce que vous enregistrez un intérêt et l'événement réel se produit quelque temps dans le futur et un autre code peut être exécuté avant que l'événement ne se déclenche. Dans l'environnement Javascript d'un navigateur, cela inclut des choses comme setTimeout() , des événements de clavier, des événements de souris, des rappels d'achèvement d'ajax, etc. Ce sont tous des événements asynchrones. Vous enregistrez un intérêt pour eux (en enregistrant un auditeur d'événement ou en passant un rappel à une fonction). Intégré à la mise en œuvre de Javascript, il existe probablement des threads qui produisent ces événements asynchrones, mais ces threads n'ont pas besoin d'être exposés au programmeur directement pour que les fonctionnalités asynchrones soient là. Par exemple, consultez cette publication pour savoir comment Javascript gère exécuter les appels ajax en arrière-plan tandis que d'autres activités Javascript sont en cours d'exécution. Tout ce que vous devez savoir, c'est que votre fonction de rappel sera appelée un temps indéterminé à l'avenir.

Ainsi, en Javascript, les promesses sont utilisées pour gérer les opérations asynchrones qui sont déjà présentes dans votre environnement. Ils ne sont pas habitués à rendre les choses non asynchiques devenues asynchrones (vous auriez besoin de threads pour pouvoir le faire).

Gardez à l'esprit que les promesses elles-mêmes sont simplement des outils de surveillance, utilisés pour surveiller les opérations asynchrones existantes. Les promesses ne sont pas en fait asynchrones, sauf pour .then() qui peuvent être implémentées avec une API intégrée telle que setTimeout() ou setImmediate() ou nextTick() . Les promesses n'ont pas besoin de leur propre code natif ou de leurs fils. En fait, vous pouvez écrire une promesse d'implémentation en version simple, javascript simple si vous le souhaitez.

Le code natif écrit par navigateur sous la couche JavaScript tend à faire en sorte que les threads soient mis en œuvre très soigneusement. Il s'avère qu'il s'agit généralement de tout ce dont vous avez besoin. Les promesses ne sont pas nécessaires pour effectuer des travaux de calcul réels en JavaScript (bien que les travailleurs le facilitent plus facilement), mais pour charger des ressources externes et obtenir des rappels lorsqu'ils sont terminés. JS Promises suffit d'affecter des rappels à ces fonctions comme "image.onLoad" et vérifier s'il faut avertir une autre fonction.

Hogan peut l'avoir résumé comme suit: une programmation événementielle.

Les promesses ne fonctionnent que parce que Javascript est une langue asynchrone (rappels) par nature. Vous pourriez donc vous demander comment javascript implémente ce mécanisme asynchrone sur un seul thread.

Voici quelques réponses:

Réponse 1

Réponse2