2017-10-08 1 views
0

J'ai eu des difficultés à apprendre des rappels et des promesses provenant d'un langage de programmation synchrone. J'ai essayé d'obtenir le résultat du fichier .env, alors je peux l'utiliser dans mon application mais console.log(envdata) retours:Lire les résultats de BlueBird Promises

Promise { 
    _bitField: 0, 
    _fulfillmentHandler0: undefined, 
    _rejectionHandler0: undefined, 
    _progressHandler0: undefined, 
    _promise0: undefined, 
    _receiver0: undefined, 
    _settledValue: undefined 
} 

Dans ma console. Comment puis-je obtenir les résultats corrects du fichier?

Voici mon code actuel.

'use strict'; 

var envdata = {}; 
var path = require('path'); 
var Promise = require('bluebird'); 
var fs = Promise.promisifyAll(require('fs')); 

module.exports = function(app, options) { 

    return new Promise(function(resolve, reject){ 
      envdata = getenvdata(options.basedir + path.sep + ".env"); 
      console.log(envdata); //need this to be the data 
      app.envdata = envdata; 
      resolve(app); 
    }); 

    function getenvdata(path){ 
     return fs.readFileAsync(path, 'utf8') 
     .then(function(data){ 
      data.split("\n").forEach(function(keyvalue) { 
       var array = keyvalue.split('='); 
       array[1] && (data[array[0]] = array[1]); 
      }); 
      return data; 
     }); 
    } 
} 
+0

Je pense qu'il ya une différence entre la promesse et un appel async^@ marvel308 – Albert

+0

@Albert Non, il n'y a pas réellement. – Tomalak

+0

Peu importe, j'essaie de savoir comment lire le résultat d'une promesse bluebird, au lieu de l'objet de promesse bluebird réel – Albert

Répondre

1

Pour lire la valeur d'une promesse que vous devez vous attacher à la chaîne de promesse (c.-à- , vous devez enregistrer un gestionnaire d'événements). Ceci est fait par .then() et les autres méthodes Promise, comme déjà noté.

J'ai quelques remarques à propos de votre code.

  • Tout d'abord, ne pas utiliser new Promise()à moins que vous sont promisfying une fonction asynchrone non-promesse, à savoir celle qui repose sur un rappel. Ce n'est pas le cas ici, donc new Promise() devrait être évité (c'est ce qu'on appelle le Explicit Promise Construction Anipattern). readFileAsync renvoie déjà une promesse, continuez simplement à utiliser celui-là. Promettre vous-même les fonctions est quelque chose que vous devez éviter en faveur des fonctions utilitaires comme promisifyAll de Bluebird ou util.promisify du nœud.
  • fs est un module de base, vous n'avez pas vraiment besoin de l'exiger.
  • Le processus consistant à lire un fichier, à le diviser en lignes, puis en touches et valeurs, peut être implémenté comme une opération de réduction de la carte, pour laquelle Bluebird a en réalité des aides soignées.
  • Last but not least, regardez dans async/avait.

Tenir compte cette prise alternatif:

'use strict'; 

var path = require('path'); 
var Promise = require('bluebird'); 
var fs = Promise.promisifyAll(fs); 

module.exports = function(app, options) { 
    return fs.readFileAsync(path.join(options.basedir, ".env"), 'utf8') 
     .then(data => data.split("\n")) 
     .map(line => line.split('=')) 
     .filter(keyval => keyval[1] > '') 
     .reduce((obj, keyval) => { obj[keyval[0]] = keyval[1]; return obj;}, {}); 
    }); 
} 

La dernière étape permet de créer un objet clé-valeur des entrées de fichier. Une manière alternative d'écrire ceci dans ES6 peut être vue over here.

utilisation

var readEnvAsync = require('readEnvAsync'); 

readEnvAsync().then(env => { 
    // ... 
}); 
+0

Intéressant concernant le chaînage des fonctions d'utilité, je l'ai utilisé dans mon code. Merci pour l'info supplémentaire. Je comprends mieux les promesses maintenant. – Albert

+0

Ils peuvent être utiles, l'une des fonctionnalités vraiment sympa de Bluebird. – Tomalak

1

Le getenvdata renvoie une promesse si vous devez utiliser la fonction then pour recueillir votre résultat comme celui-ci

return new Promise(function(resolve, reject){ 
      getenvdata(options.basedir + path.sep + ".env").then(function(envdata){ 
      console.log(envdata); //need this to be the data 
      app.envdata = envdata; 
      resolve(app); 
     }) 
    }); 
+1

Merci, maintenant je sais comment ils fonctionnent. Beaucoup apprécié – Albert

+0

@Albert C'est exactement ce que la question en double était. – str

+0

@str mon mauvais, je pensais juste que les promesses ne sont pas comme des rappels – Albert