node.js - 回调不返回数据
问题描述
我正在尝试制作一个卷积神经网络并使用一个返回数据的函数来激活它。我在异步部分遇到问题,因为当我尝试回调数据并记录它时,它返回一个空对象。
const convolute = (callback) => {
let inputData = {};
for(let p = 0; p < files.length; p++){
let fileData = [];
let pixels = [];
let dimensions = [];
let image, iterationArr;
let FinalVector = [];
fs.readFile("./imgs/" + files[p], "utf8", (err, data) => {
if(err) console.log(err);
fileData = data.split("\n");
dimensions = fileData[0].split(" ").map(l => parseInt(l));
pixels = fileData[1].split(" ").map(p => parseInt(p));
pixels.splice(pixels[pixels.length-1], 1);
pixels = MM.convertToMatrix(pixels, dimensions[0]);
image = new ImageProcess(pixels);
for(let i = 0; i < edges.length; i++){
iterationArr = image.pixels;
let iteration = 0
while(iterationArr.length > 30){
iteration++;
iterationArr = image.start(iterationArr, edges[i]);
}
let iterationVector = MM.convertToVector(iterationArr)
for(let i = 0; i < iterationVector.length; i++){
FinalVector.push(iterationVector);
}
}//end of each file
let fileName = files[p].substring(0, files[p].length -4);
inputData[fileName] = FinalVector;
});//end of reading file
}//new file reading starts here
callback(inputData)
}//takes roughly around 5 seconds to execute
convolute((data) => {
console.log(data);
})
files
是一个存储所有文件名的数组。 FinalVector
是包含 2000 多个项目的数组。我已经进行了一些测试并且代码有效,我知道这一点是因为当我分别记录每个文件向量时它会返回数据,但是当我使用回调从函数返回数据时会出现问题。
PS。我只包含了我的代码中可能导致我的问题的相关部分。
解决方案
inputData
是空的,因为readFile
是异步的:callback(inputData)
在每个readFile
where的回调inputData
被填充之前调用。
所以callback(inputData)
应该在处理完所有(异步)后调用:在读取所有文件后readFile
的回调中:readFile
const convolute = (callback) => {
let inputData = {};
let remainings = files.length;
if (!remainings) {
callback(inputData);
return;
}
for (let p = 0; p < files.length; p++) {
fs.readFile("./imgs/" + files[p], "utf8", (err, data) => {
if (err) {
console.log(err);
}
else {
/* process data simplified */
inputData[files[p]] = data;
}
if (--remainings <= 0) {
callback(inputData);
}
});
}
};
推荐阅读
- machine-learning - 如何打印逗号分隔的输出?
- pointers - 如何使用现有指针将指针分配给记录元素?
- python - 使用 discord.py 循环访问公会成员
- git - 将 VCS 添加到复杂的开发/生产环境的最佳 git 策略
- parsing - AllenNLP:使用 Taskdemo 和 Python 库的不同选区解析
- python - 如何定位 Pyspark Dataframe 中特定行中的特定列?
- batch-file - 删除文件计数器有效,但提供随机数
- python - 想在 Python 中使用正则表达式对单词进行分组,就像字符类和重复量词对字符进行分组一样
- java - 如何提高简单 java 游戏循环中的帧率?
- sql-server - SQL Server dm_exec_input_buffer linq 动态查询的问题