【发布时间】:2016-12-23 18:06:17
【问题描述】:
我最近在执行 node.js 文件时遇到了问题。 我将发布代码并解释问题所在。
我有 2 个文件,即 testit.js 和 test.js
在 test.js 中,我使用 module.exports 将包含文本文件的文件路径的数组对象传递给 testit.js
["a.txt","b.txt"]
在 testit.js 中,module.exports.text 接受文件名的数组对象,
通过Object.keys(texts).forEach处理每一个,
通过readFile,读取每个返回的缓冲区值,
通过takeAction
返回包含在该缓冲区中的文本
并将其存储在数组对象newtexts中。
但是当 newtexts 被解析并且调用返回到 then() 时,newtexts 正在命令行上打印,它返回一个 EMPTY ARRAY OBJECT 而不是返回每个文件内容的数组对象那些文件。
谁能解释我在代码中哪里出错了? 非常感谢。
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)。到达 resolve 行时,甚至没有一个 forEach() 回调开始执行。使用
array.map将您的 texts 数组映射到 Promise 数组,并使用Promise.all().then()等待数组中的每个 Promise 完成后再解析 Promise。 -
我是 Node.js 的新手,如果可能的话,您能否发布一个解决方案?
-
不是答案,但我发现您在数组上使用 Object.keys 并访问数组 [key] 很奇怪。为什么不直接遍历数组本身?
-
是的,我本可以使用传统的
for循环而不是使用Object.keys(),而我只是第一次尝试Object.keys(),但两者都无法正常工作@PMV 之前说过。
标签: javascript node.js promise arrayobject