Я пытаюсь читать async из файла angularJs. Имея ужасное время, пытаясь сделать переменную mySuperFile доступной за пределами обратного вызова. См. Код ниже.
fs.readFile('myfile','utf8', function (err, data){
var mySuperFile = JSON.parse(data);
});
//I want mySuperFile available HERE
Поскольку 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()
)
Из-за асинхронного характера js вы не можете сделать что-то вроде этого:
var mySuperFile;
fs.readFile('myfile','utf8', function (err, data){
mySuperFile = JSON.parse(data);
});
console.log(mySuperFile);
Это связано с тем, что строка console.log(mySuperFile); не будет ждать завершения вышеописанной функции.