2017-10-08 85 views
0

我一直无法学习来自同步编程语言的回调和承诺。我一直试图让.env文件的结果,这样的话,我可以在我的应用程序中使用它,而是console.log(envdata)回报:BlueBird Promises的阅读结果

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

在我的控制台。我怎样才能从文件中获得正确的结果?

这是我目前的代码。

'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

我认为有承诺和异步调用之间的差异^ @ marvel308 – Albert

+0

@Albert没有,实际上不是。 – Tomalak

+0

无论如何,我试图找出如何读取蓝鸟承诺的结果,而不是实际的蓝鸟承诺对象 – Albert

回答

1

要阅读您必须将自己的诺言链诺言的价值getenvdata返回一个承诺(即,你必须注册一个事件处理程序)。正如已经提到的,这通过0​​和其他Promise方法完成。

我对你的代码有一些评论。

  • 首先,不使用new Promise()除非你promisfying非承诺异步函数,即一个依赖一种回调。这里不是这种情况,所以应该避免使用new Promise()(这称为Explicit Promise Construction Anipattern)。 readFileAsync已经返回一个承诺,只是继续使用该承诺。
  • 您自己的Promisifying函数本身就是您应该避免使用的功能,例如Bluebird的promisifyAll或节点的util.promisify
  • fs是一个核心模块,你并不需要它。
  • 读取文件的过程将文件拆分成行,然后分解为键和值,可以实现为map-reduce操作,Bluebird实际上具有整洁的帮助器。
  • 最后但并非最不重要的,看看async/avait

考虑这个另类观点:

'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;}, {}); 
    }); 
} 

最后一步从文件条目创建一个键值对象。在ES6中编写这个的另一种方法可以看到over here

使用

var readEnvAsync = require('readEnvAsync'); 

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

有趣的关于实用函数的链接,我用它在我的代码。感谢您的额外信息。我现在明白许诺会好很多。 – Albert

+0

他们可以派上用场,这是Bluebird的一个非常棒的功能。 – Tomalak

1

,所以你需要使用then功能来收集你的结果是这样

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

谢谢,现在我知道他们是如何工作的。非常感谢 – Albert

+0

@Albert这正是重复问题的含义。 – str

+0

@str我的坏,我只是认为承诺不像回调 – Albert