J'apprends des nœuds. Une chose que je trouve vraiment ennuyeux est lorsque vous travaillez avec des promesses d'un console interactive em> tout en débogage et / ou tout simplement piquer sur les interfaces de diverses bibliothèques. Le flux de travail est normalement; Appelez une bibliothèque pour faire du travail, attendre le résultat, percez-vous à la suite de voir comment cela se comporte et ressemble à cela. Par exemple (et juste par exemple) Je souhaite inspecter de manière interactive la structure de données d'image renvoyée de JIMP . Je trouve moi-même faire cela à partir de la console: p> Cette plaque de chaudière devient gênante d'écrire .. Je pense avoir raté un tour. Y a-t-il un moyen plus pratique de cela? Un réglage peut définir ou une bibliothèque que je peux charger ou quelque chose? P> Je préférerais faire ceci: p> mais cela donne "SyntaxError: attendre" SyntaxError: n'est valable que dans la fonction Async ". Ou sinon cela, alors peut-être: p> ...
let image = resolveMe(Jimp.read(data))
// Work with image here ...
3 Réponses :
C'est ce que Vous pouvez simplement écrire: p> et la seule exigence est que la fonction que vous le faisiez doit être déclaré asynchronisé. Cela signifie que vous avez besoin à tout le moins d'avoir une fonction em>, vous ne pouvez pas utiliser async code> -
attendre code> est pour. Il vous permet d'écrire un code ASYNC d'une manière que ressemble à un code synchrone em>, même si sous la hotte, c'est exactement la même chose que d'utiliser des promesses. Les promesses finissent par être très maladroite avec toute la nidification de fonctions.
attendre code> au niveau le plus externe. P> p>
Mais il doit être dans une fonction asynchrone. Vous ne pouvez pas simplement écrire let image = attendre Jimp.read (données); code> à l'invite. J'ai presque qualifié dans la question: je ne cherche pas async / attendre.
Oui. J'ai ajouté un "P.s" s'il vous plaît lire. Je sais ce qu'Assync / attendre est - plus ou moins. Essayez d'exécuter Laisser image = attendre Jimp.read (données); code> à l'invite de commande.
Le nœud utilise async pour ~ tout. Je pensais qu'il y avait peut-être un patch de singe similaire à ce que Bluebird est de promettre, de faire des choses synchrones à la console.
nœud.js n'a pas vraiment un moyen d'attendre un événement, Afaict. Mais en mode interactif, en supposant que vous attendiez, tout ce que vous aimez de faire quelque chose avec le résultat, j'ai donc essayé de trouver des moyens pratiques de le faire.
Le plus proche que je puisse arriver, c'est un assistant comme celui-ci: P > exemple d'utilisation: p> Vous ne pouvez toujours pas attendre qu'il soit terminé, mais au moins le résultat est disponible. P > p>
J'ai trébubli sur un Répondre pour mon Q. Pour Node V12 +, vous pouvez définir le - Expérimental-Repl'attend Option. Était juste sous mon nez tout au long de ... Résumé:
sans: em> p> avec: em> p>
Qu'en est-il de
let image = attendre Jimp.read (données); code>? Devrait être à l'intérieur d'une fonction code> async code> à autoriser. Fondamentalement, le code asynchrone est simplement une sorte de douleur une ligne à la fois dans un terminal interactif. Je viens de trouver plus facilement d'écrire un programme de 10 lignes et de l'exécuter dans Node.js. Si je veux inspecter les choses, je l'exécute dans le débogueur et dans le débogueur, puis sur les points d'arrêt. Ou parfois, il suffit d'inspecter en insérant des énoncés
console.log () code> et l'exécuter.
Eh bien, votre édition dit que vous ne voulez pas vous contrôler à la boucle d'événement. Aucune opération asynchrone ne peut compléter sans donner de contrôle à la boucle d'événement, alors ce que vous demandez ne peut pas être fait. Ils terminent leur travail en insérant un événement dans la boucle d'événement et que cet événement ne peut être traité avant de revenir au contrôle de la boucle d'événement. Donc, par définition, vous devez. JavaScript ne fonctionne pas comme vous le demandez, donc donc la console ne peut pas non plus.
Votre pensée trop littéralement. Oui, bien sûr, vous devez redonner le contrôle de la boucle d'événement. Mais il n'y a aucune raison de ne pas être cachée de l'utilisateur. Je n'ai pas dit que je "ne veux pas" redonner le contrôle de la boucle d'événement. J'ai dit / signifiait que c'est comment les fonctions asynchronisées obtiennent EVALD.
Eh bien, vous demandez des choses qui ne fonctionnent pas de cette façon. Ecrivez une promesse interactive différente, je suppose que cela fonctionne comme vous le souhaitez. Je ne pense pas qu'il y ait quelque chose que nous pouvons faire pour aider. Je n'ai jamais compris personnellement l'attrait de la console interactive pour autre chose que des trucs vraiment fondamentaux de toute façon. Je trouve tellement plus facile de simplement écrire un programme court et de l'exécuter, de le déboguer, d'insérer
console.log () code> des instructions, éditez-la, exécutez-la, etc ... bien plus efficace pour mon travail que l'invite.
"Cela ne fonctionne pas de cette façon et il n'y a rien dans la boîte à outils de programmeur de nœud qui le fait ..." serait une réponse parfaitement acceptable. Peut-être que vous dites qu'il serait trop difficile d'écrire une enveloppe de console qui fonctionne de cette façon, mais pourquoi réinventer la roue si cela a été fait. D'où la Q.
P.s. J'ai été modifié à nouveau pour montrer
attendre code> ne fonctionne pas à partir de l'invite de commande, mais ce serait cool si cela pourrait.
Oui, ce serait utile si
attendre code> travaillé à l'invite. Pas de raison conceptuelle pour laquelle cela ne pourrait pas, ils ne l'ont tout simplement pas fait. Je vous suggérerais que vous apprendrez à utiliser le débogueur pour inspection variable et à placer votre code dans un petit fichier et à l'exécuter dans le débogueur. Vous pouvez ensuite faire la ligne par exécution de ligne avec des points d'arrêt où vous voulez. Vous pouvez l'envelopper dans une fonction
async code> et utiliser
attendre code>, etc ...