Почему моя функция обратного вызова не вызывается? - PullRequest
0 голосов
/ 02 марта 2019

У меня есть функция, которая получает содержимое загрузки файлов и помещает их в массив.Мне нужно, чтобы этот массив был указан в функции, которая вызывает функцию.У меня есть обратный вызов в вызывающей функции, но он не вызывается.

Есть предложения?(В целях иллюстрации у меня есть 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 голосов
/ 02 марта 2019

Вы вызываете функцию 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)
});
0 голосов
/ 02 марта 2019

Вы должны передать и перезвонить на 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
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...