我最近在执行node.js文件时遇到了问题。 我会发布代码并解释问题所在。Promise为什么返回(解析)Node.js中的空对象?
我有2个文件即testit.js和test.js
在test.js,我使用module.exports
传递数组对象,包含TEXTFILES的文件路径,向testit.js["a.txt","b.txt"]
在testit.js,module.exports.text接受文件名的阵列对象,
处理通过Object.keys(texts).forEach
每个它,
读取通过readFile
每个返回的缓冲器值的,
通过takeAction
返回包含在该缓冲区中的文本,并将其存储在数组对象newtexts
中。
但当newtexts解决并调用返回到然后(),其中newtexts被印刷在命令行,则返回空的Array对象而不是返回的每个这些文件的文件内容的阵列对象。
有人可以解释我在代码中出错的地方吗? 感谢提前一吨。
test.js
var testit = require('./testit');
var texts = ["a.txt","b.txt"];
testit.text(texts).then(function(newtexts){
console.log(newtexts);
});
testit.js
var Promise = require('bluebird');
var S = require('string');
var fs = require("fs");
module.exports.text = function(text){
var texts = text;
var length = Object.keys(texts).length;
return new Promise(function(resolve, reject){
var newtexts = [];
var takeAction = function(text) {
return text.toString();
}
var readFile = function (filename, enc){
return new Promise(function (resolve, reject){
fs.readFile(filename, enc, function (err, buffer){
if(err)
reject(err);
else
resolve(buffer);
});
});
}
Object.keys(texts).forEach(function(key){
readFile(texts[key]).then(function(text){
newtexts[key] = takeAction(text);
});
});
resolve(newtexts);
});
}
因为在实际添加到新文本之前,您正在调用resolve(newtexts)。 forEach()回调甚至没有开始执行,直到到达决定行。使用'array.map'将你的文本数组映射到一个Promises数组,然后使用'Promise.all()。then()'等到数组中的每个Promise完成后再解析Promise。 – PMV
我是Node.js的新手,所以如果可能的话,你可以请一个解决方案吗? –
不是答案,但我觉得很奇怪你在一个数组上使用Object.keys并访问array [key]。为什么不只是遍历数组呢? – Gerrit0