1
votes

Puis-je attendre la résolution de la promesse (requête HTTP) avant d'exporter une variable dans le module NodeJS?

Je dois utiliser une valeur calculée de manière asynchrone dans un script synchrone que je ne peux pas rendre asynchrone.

Si j'écris un module pour faire la requête HTTP et calculer la valeur, quand j'ai besoin / l'importer renverra une promesse:

// sync-script.js
const getCurrencyConversion = require('./get-currency-conversion')
const myComputedValue = getCurrencyConversion(42)
// do sync stuff with it from here on out

Puis-je concevoir mon module async pour attendre la réponse HTTP et renvoyer une valeur au lieu d'une promesse? Dois-je?

Je cherche à pouvoir:

// sync-script.js
const getCurrencyConversion = require('./get-currency-conversion')
getCurrencyConversion().then(result => console.log('Well too late now'))

Le blocage ne me dérangerait pas dans mon petit script, il est logique d'attendre pour la demande avant de continuer.

Mais j'aimerais mieux comprendre comment gérer des situations comme celles-ci. Ma compréhension actuelle est qu'une fois que vous êtes asynchrone, vous ne pouvez jamais «revenir en arrière». Le script de synchronisation doit prendre en charge async, sinon il ne fonctionnera pas.


5 commentaires

quel est le problème avec le fait que tout le script s'exécute dans .then - Je veux dire, tout ce qui se trouve à l'intérieur de .then sera "synchro"


Je ne peux pas faire ça, c'est un fichier .scas.js , juste module.exports = {// scas stuff} . Pour utiliser myComputedValue dans une fonction de tube qui transforme l'entrée, elle doit être ... pré-calculée à ce stade.


Non, vous ne pouvez pas faire en sorte qu'une exportation attende la fin d'une opération asynchrone. Le mieux que vous puissiez faire est d'exporter une promesse puis d'utiliser .then () sur cette promesse dans le script qui veut consommer la valeur. Il n'existe aucun moyen de transformer une valeur asynchrone en valeur de synchronisation en Javascript. Je ne peux pas le faire.


La seule solution que j'ai vue est de récupérer la valeur async dans un autre programme node.js et d'utiliser l'une des options sync child_process comme child_process.spawnSync () pour exécutez cet autre programme. Cela vous permet techniquement de faire du réseautage de manière synchronisée. Évidemment non recommandé pour un processus serveur, mais peut être fait pour votre propre script mono-utilisateur.


Ou, vous récupérez la valeur asynchrone au démarrage et vous ne démarrez en quelque sorte pas la partie de synchronisation de votre script avant d'avoir récupéré la valeur async afin que la partie de synchronisation puisse simplement s'exécuter (ayant déjà la valeur async disponible). Vous ne partagez aucun contexte de cette partie de synchronisation, nous ne pouvons donc pas vous aider très bien à gérer cela.


3 Réponses :


-4
votes

vous pouvez rendre votre code asynchrone à l'aide de Promises tu devrais juste l'envelopper en promesse

https://developer.mozilla.org / fr-FR / docs / Web / JavaScript / Reference / Statements / async_function


3 commentaires

Je ne pense pas que vous ayez besoin d'envelopper le code dans une promesse ... il suffit de tout mettre dans le script à l'intérieur du . Puis


@JaromandaX Mettre tout dans le script de synchronisation dans le .then serait génial mais je ne peux pas faire ça. Je me demande si je peux faire quelque chose du côté du module importé, où j'ai le contrôle.


@Leeroy - pas si vous voulez que le résultat reste asynchrone - encore une fois, sans contexte, je ne vois pas pourquoi vous ne pouviez pas tout mettre à l'intérieur de . Alors



-4
votes

Vous pouvez créer une fonction asynchrone et obtenir les valeurs avant de passer à l'étape suivante. Pour plus d'informations, consultez ce https: // développeur. mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await si c'est une promesse, il retournera cela sinon la valeur elle-même.

const getCurrencyConversion = require('./get-currency-conversion')
const myComputedValue = async()=> await getCurrencyConversion(42);
console.log('value is',myComputedValue)


1 commentaires

myComputedValue ne sera-t-il pas simplement une FONCTION ? (indice: oui, ça va)



1
votes

Les promesses renvoient Promise et non une Valeur

De plus, lorsque vous avez attribué getCurrencyConversion à myComputedValue , vous avez en fait attribué la promesse qui est en attente, car lorsque vous définissez une variable comme myComputedValue, elle l'attribuera immédiatement pour que Javascript n'attende pas . C'est pourquoi javascript rapide


0 commentaires