【问题标题】:Callback not returning data回调不返回数据
【发布时间】:2018-07-16 03:54:23
【问题描述】:

我正在尝试制作一个卷积神经网络,并使用一个返回数据的函数来激活它。我在异步部分遇到问题,因为当我尝试回调数据并记录它时,它返回一个空对象。

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 多个项目的数组。我已经做了一些测试并且代码有效,我知道这是因为当我分别记录每个文件向量时它会返回数据,但是当我使用回调从函数返回数据时会出现问题。

附言。我只包含了我的代码中可能导致我的问题的相关部分。

【问题讨论】:

    标签: node.js asynchronous callback


    【解决方案1】:

    inputData 为空,因为 readFile 是异步的:callback(inputData) 在每个 readFile 的回调之前调用,其中 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);
                }
            });
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-18
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      相关资源
      最近更新 更多