Недавно я столкнулся с проблемой при выполнении файла node.js. Я отправлю код и объясню, в чем проблема.Почему Promise возвращает (разрешать) пустой объект в Node.js?
У меня есть 2 файла, а именно testit.js и test.js
В test.js, я передаю объект массив, содержащий файл пути текстовых файлов, к testit.js с помощью module.exports
["a.txt","b.txt"]
В testit.js, module.exports.text принимает объект массив имен файлов,
обрабатывает каждый из него через Object.keys(texts).forEach
,
считывает каждый из возвращаемых значений буфера через readFile
,
возвращает текст, содержащий в этом буфере, через takeAction
и сохраняет его в объекте массива newtexts
.
Но когда newtexts разрешен и вызов возвращается в то(), в котором newtexts печатается на командной строке, он возвращает EMPTY 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);
});
}
Поскольку вы вызываете решение (newtexts), прежде чем что-либо фактически добавлено в newtexts. Ни один из callback-запросов forEach() даже не начал выполняться по точке, к которой вы достигли линии разрешения. Используйте 'array.map' для сопоставления массива ваших текстов с массивом Promises и используйте' Promise.all(). Then() ', чтобы дождаться, пока все обещания в массиве не будут выполнены до разрешения Promise. – PMV
Я новичок в Node.js, поэтому можете ли вы отправить решение на это, если это возможно? –
Не ответ, но я нахожу довольно странным, что вы используете Object.keys в массиве и получаете доступ к массиву [key]. Почему бы просто не зациклиться на самом массиве? – Gerrit0