2016-03-16 3 views
0

У меня есть код nodejs, который имеет обратный вызов, и я не мог понять, как он работает. Может кто-нибудь объяснить этоОбратный вызов без параметра в javascript

function readJSONIntoArray(directory, array, callback) 
{ 
    var ending = 'json'; 
    fs.readdir(directory, function (err, files) 
    { 
     if (err) 
      throw err; 
     var fileCnt = files.length; 
     files.forEach(function (file) 
     { 
      if (endsWith(file, '.' + ending)) 
      { 
       file = file.substring(0, file.length - (ending.length + 1)); 
       var fileContent = require(path.join(directory, file)); 
       array.push(fileContent); 
       log.info('Read file: ' + file); 
      } 
      fileCnt--; 
      if (fileCnt === 0 && typeof callback === 'function') 
      { 
       callback(); 
      } 
     }); 
    }); 
} 

Здесь обратный вызов пуст, поэтому, я думаю, никакое значение не возвращается. Но в фактическом выводе массив возвращается. Я не мог понять, что пустой обратный вызов может возвращать массив.

Вызов функции: readJSONIntoArray(profilefolder, profiles, setProfileDescriptions);

Определение setProfileDescriptions отдельно.

function setProfileDescriptions() 
{ 
    profiles = bubblesort(profiles, 'order'); 
} 

Внутри setProfileDescriptions массив профиля заполняется JSon данных из файла для чтения в функции чтения. Может ли кто-нибудь объяснить, как третий аргумент в вызове функции readJSONIntoArray распознается как функция и возвращаются профили массива?

+1

профили не заданы параметру 'setProfileDescription'. Однако переменная может быть глобальной, если вы можете получить к ней доступ из-за этого. –

ответ

0
var globalArray=[]; 
function readFunction(path,globalArray,callbackFunction){ 
    globalArray.push(path); 
    callbackFunction(); 
} 
function callbackFunction(){ 
    //globalArray was global so i can call here 
    console.log(globalArray); 
} 

readFunction('filePath',globalArray,callbackFunction); 

рассмотреть выше кода, потому что «globalArray» объявлен как глобальный я могу получить доступ внутри функции обратного вызова

+0

В вашем примере 'globalArray' является аргументом' readFunction', а не глобальной переменной. –

+0

, но я сначала объявляю globalArray. поэтому его следует рассматривать как глобальную переменную? –

+0

Нет, внутри 'readFunction' он затенен локальной переменной. Таким образом, ваш «глобальный» 'globalArray' не будет затронут' readFunction', если он не передан в качестве аргумента. И объявляя это до того, как 'readFunction' ничего не делает в вашем примере. –

2

Вы правы, что readJSONIntoArray does't вернуть что-либо в это callback. Вместо этого он добавляет новые данные во второй аргумент array, тем самым изменяя его.

Так, readJSONIntoArray должна была быть использована следующим образом:

var content = []; // empty array to accumulate data from readJSONIntoArray function 
readJSONIntoArray('some directory', content, function() { 
    // content is full of data now 
    doSomething(content); 
}); 

Хотя я должен отметить, что это не обычная картина в Node.js, и что его следует избегать, потому что это слишком сбивает с толку.

В самом деле, есть в readJSONIntoArray реализации несколько вещей, которые были сделаны неправильно:

  • функция никогда не должен мутировать свои аргументы;
  • Асинхронные функции не должны throw ошибок, они должны возвращать их в callback;
  • любые данные, полученные функцией, также должны быть возвращены в callback.
Смежные вопросы