我在学习来自同步编程语言的回调和承诺方面遇到了困难。我一直试图获得.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;
});
}
}发布于 2017-10-08 10:01:35
要读取承诺的值,必须将自己附加到承诺链(即,必须注册事件处理程序)。这是通过.then()和其他承诺的方法完成的,如前所述。
不过,我对您的代码有一些评论。
new Promise(),除非您使用的是不承诺的异步函数,即依赖回调的异步函数。这里的情况并非如此,因此应该避免使用new Promise() (这称为Explicit Promise Construction Anipattern)。readFileAsync已经返回了一个承诺,就继续使用它吧。promisifyAll或节点的util.promisify。fs是一个核心模块,您并不需要它。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 => {
// ...
});发布于 2017-10-08 09:39:36
getenvdata正在返回一个承诺,所以您需要使用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);
})
});https://stackoverflow.com/questions/46629533
复制相似问题