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

问题描述 投票:-2回答:2

我有一个函数,它获取一堆文件的内容并将它们放在数组中。我需要在调用函数的函数中引用该数组。我在调用函数中有一个回调但它没有被调用。

有什么建议? (为了说明的目的,我在数组上有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 })
        })
      }
    })
  });
}
javascript callback
2个回答
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
  });
}

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)
});
© www.soinside.com 2019 - 2024. All rights reserved.