web-dev-qa-db-fra.com

Comment attendre qu'une promesse soit résolue?

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?

33
sinθ

É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.

4
tcurdt

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.

3
Esailija