J'ai affaire à un framework NodeJs qui nécessite qu'une certaine fonction soit synchrone, mais j'ai besoin de récupérer une valeur qui ne peut être accédée que de manière asynchrone. Dans un monde parfait, je serais en mesure de retourner une promesse, mais je ne peux pas.
En tant que solution rapide et sale, j'ai créé la méthode suivante:
exports.synchronizePromise = function(promise) {
var value;
promise.then(function(promiseValue) {
value = promiseValue;
});
while (!value) {} // Wait for promise to resolve
console.log("DONE: " + value); // Never reached
return value;
};
Mais je reçois une erreur. Existe-t-il un moyen d'accomplir ce dont j'ai besoin?
Étant donné que le nœud est par défaut un seul thread, il n'y a pas vraiment de moyen facile de résoudre ce problème. Il y en a un cependant. Sur la base des générateurs/fibres, vous pouvez ajouter une sorte d'exécution simultanée au nœud. Il y a une waitfor
implémentation basée sur cela.
En Q si vous avez une promesse résolue, vous pouvez simplement prendre la valeur avec inspect
exports.synchronizePromise = function(promise) {
var i = promise.inspect();
if (i.state === "rejected") {
throw i.reason;
} else if (i.state === "fulfilled") {
return i.value;
} else {
throw new Error("attempt to synchronize pending promise")
}
};
Cependant, si la promesse est en attente, elle est vraiment asynchrone et votre question n'a alors aucun sens et la fonction générera une erreur.