Асинхронный вызов в угловом JavaScript

0

Я пытаюсь читать async из файла angularJs. Имея ужасное время, пытаясь сделать переменную mySuperFile доступной за пределами обратного вызова. См. Код ниже.

fs.readFile('myfile','utf8', function (err, data){
    var mySuperFile = JSON.parse(data);
});

//I want mySuperFile available HERE
  • 1
    то, что вы хотите сделать, невозможно. Вы должны продолжать работать с вашим файлом внутри функции обратного вызова. Если вы хотите сделать его более красивым, взгляните на решения Promise
Теги:
gulp

2 ответа

3
Лучший ответ

Поскольку readFile является асинхронным, все, что использует это, также должно быть асинхронным.

Вот такой подход:

var fetchMySuperFile = new Promise(function(resolve, reject) {
   fs.readFile('myfile','utf8', function (err, data){
       resolve(JSON.parse(data));
   });
};

fetchMySuperFile.then(function(mySuperFile) {
   // OK, you have it now.
});

Это может быть полезно. Суть javascript-обещаний заключается в том, что вы можете вызывать fetchMySuperFile.then несколько раз, но он все равно будет только вызван readFile один раз.

Конечно, поскольку он угловат, вы можете использовать $q вместо Promise. Причина в том, что после разрешения $q угловые обновления. (Вам не нужно вызывать $scope.$apply())

  • 0
    Спасибо @Andrew Shepherd. Я думаю, что ваш ответ, вероятно, ближе всего к решению. Эта проблема заключается в том, что я пытаюсь отредактировать файл bower с помощью gulp-json-editor. Чтобы это работало, jEditor нужно, чтобы mySuperFile находился в своей области видимости и не был встроен в другую функцию (я не знаю, почему это так). Спасибо, в любом случае
0

Из-за асинхронного характера js вы не можете сделать что-то вроде этого:

var mySuperFile;
fs.readFile('myfile','utf8', function (err, data){
    mySuperFile = JSON.parse(data);
});
console.log(mySuperFile);

Это связано с тем, что строка console.log(mySuperFile); не будет ждать завершения вышеописанной функции.

  • 0
    вот почему он должен использовать обещания;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню