阅读BlueBird Promises

时间:2017-10-08 09:25:46

标签: javascript node.js promise

我一直无法学习来自同步编程语言的回调和承诺。我一直试图获取.env文件的结果,因此我可以在我的应用程序中使用它,而不是console.log(envdata)返回:

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;
        });
    }
}

2 个答案:

答案 0 :(得分:1)

Flink正在返回一个承诺,因此您需要使用getenvdata函数来收集您的结果

then

答案 1 :(得分:1)

要读取承诺的值,您必须将自己附加到承诺链(即,您必须注册事件处理程序)。如前所述,这是通过.then()和其他Promise方法完成的。

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

  • 首先,请不要使用new Promise() ,除非您正在满足非承诺异步功能,即依赖回调的功能。这不是这种情况,因此应避免使用new Promise()(这称为Explicit Promise Construction Anipattern)。 readFileAsync已经返回一个承诺,只需继续使用该承诺。
  • 自己实现的功能本身就是你应该避免使用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;}, {});
    });
}

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

使用

var readEnvAsync = require('readEnvAsync');

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