首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阅读BlueBird承诺的结果

阅读BlueBird承诺的结果
EN

Stack Overflow用户
提问于 2017-10-08 09:25:45
回答 2查看 508关注 0票数 0

我在学习来自同步编程语言的回调和承诺方面遇到了困难。我一直试图获得.env文件的结果,所以我可以在我的应用程序中使用它,但是console.log(envdata)返回:

代码语言:javascript
复制
Promise {
  _bitField: 0,
  _fulfillmentHandler0: undefined,
  _rejectionHandler0: undefined,
  _progressHandler0: undefined,
  _promise0: undefined,
  _receiver0: undefined,
  _settledValue: undefined
}

在我的控制台里。我如何从文件中获得正确的结果?

这是我目前的密码。

代码语言:javascript
复制
'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;
        });
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-08 10:01:35

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

不过,我对您的代码有一些评论。

  • 首先,不要使用new Promise(),除非您使用的是不承诺的异步函数,即依赖回调的异步函数。这里的情况并非如此,因此应该避免使用new Promise() (这称为Explicit Promise Construction Anipattern)。readFileAsync已经返回了一个承诺,就继续使用它吧。
  • 自己对函数进行预测本身就是你应该避免的,它有利于实用函数,比如蓝知更鸟的promisifyAll或节点的util.promisify
  • fs是一个核心模块,您并不需要它。
  • 读取文件、将文件拆分成行、然后将其分解为键和值的过程可以作为map-还原操作来实现,Bluebird实际上为其提供了整洁的帮助。
  • 最后但并非最不重要的是,看看avait

考虑这一备选办法:

代码语言:javascript
复制
'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

用法

代码语言:javascript
复制
var readEnvAsync = require('readEnvAsync');

readEnvAsync().then(env => {
    // ...
});
票数 1
EN

Stack Overflow用户

发布于 2017-10-08 09:39:36

getenvdata正在返回一个承诺,所以您需要使用then函数来收集您的结果如下

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46629533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档