为什么我的回调函数没有被调用?

时间:2019-03-02 11:59:03

标签: javascript callback

我有一个函数来获取文件加载的内容并将其放置在数组中。我需要在调用该函数的函数中引用该数组。我在调用函数中有一个回调,但是没有被调用。

有什么建议吗? (出于说明目的,我需要在数组上进行2次控制台日志调用。第一个在我的回调内部,从未被调用,第二个在其外部,并且毫不奇怪地显示了一个空数组。)

const fs = require('fs');
const path = require('path')
const chai = require('chai');
const chaiExpect = chai.expect;
const logger = require('../../../../app/logger/winston');
const pageFolder = 'app/views/pages';

let pages = [];

fdescribe('html pages', function () {
  buildPages(function () {
    console.log(pages);
  });
  console.log(pages)
})

function buildPages() {
  filewalker(pageFolder, function (err, pageList) {
    if (err) {
      throw err;
    }
    pageList.forEach(function (file) {
      if (!fs.file.isDirectory) {
        fs.readFileSync(file.substring(39), 'utf8', function (err, pageContents) {
          if (err) throw err;
          pages.push({ file: file.substring(39), page: pageContents })
        })
      }
    })
  });
}

2 个答案:

答案 0 :(得分:0)

您应传递回调并调用buildPages

const fs = require('fs');
const path = require('path')
const chai = require('chai');
const chaiExpect = chai.expect;
const logger = require('../../../../app/logger/winston');
const pageFolder = 'app/views/pages';

let pages = [];

fdescribe('html pages', function () {
  buildPages(function () {
    console.log(pages);
  });
  console.log(pages)
})

function buildPages(cb) {
  filewalker(pageFolder, function (err, pageList) {
    if (err) {
      throw err;
    }
    pageList.forEach(function (file) {
      if (!fs.file.isDirectory) {
        fs.readFileSync(file.substring(39), 'utf8', function (err, pageContents) {
          if (err) throw err;
          pages.push({ file: file.substring(39), page: pageContents })
        })
      }
    })
    cb(); // <--- HERE
  });
}

答案 1 :(得分:0)

您正在调用带有函数参数的buildPages函数,甚至认为您没有将其配置为接受任何参数。这就是为什么内部函数不会被调用的原因。

只需在buildPages中添加一个回调函数作为参数,并在完成buildPages中的所有任务后调用该回调函数

const fs = require('fs');
const path = require('path')
const chai = require('chai');
const chaiExpect = chai.expect;
const logger = require('../../../../app/logger/winston');
const pageFolder = 'app/views/pages';

let pages = [];

fdescribe('html pages', function () {
  buildPages(function () {
    console.log(pages);
  });
  console.log(pages)
})

function buildPages(callback) {
  filewalker(pageFolder, function (err, pageList) {
    if (err) {
      throw err;
    }
    pageList.forEach(function (file) {
      if (!fs.file.isDirectory) {
        fs.readFileSync(file.substring(39), 'utf8', function (err, pageContents) {
          if (err) throw err;
          pages.push({ file: file.substring(39), page: pageContents })
        })
      }
    })
    callback();
  });
}

但是我强烈建议您是否要从另一个函数中获取一些数据。不要使用全局变量,因为您的代码很难维护您添加到其中的更多内容,而是将数据作为参数传递。

function functionWithResult(callback) {
    setTimeout(() => {
        var result = [1,2,3,4,5]
        callback(result)
    }, 1000)
}


functionWithResult(function(result) {
    console.log(result)
});