Как я могу вернуть значение из этой дочерней функции в javascript - PullRequest
2 голосов
/ 03 февраля 2020

не может вернуть значение dat [0] из внутренней функции

let ite = fs.readdir(directoryPath, function (err, files) {
  if (err) {
    return console.log('Unable to scan directory: ' + err);
  }
  dat = files.filter(item => item[1] == files.length);
  return dat[0];
});

Ответы [ 3 ]

1 голос
/ 03 февраля 2020

Вы возвращаетесь из функции, которая будет вызываться после завершения операции. Таким образом, возвращение из этой функции не меняет значение вашей переменной.

Вы можете использовать readdirSync

const res = fs.readdirSync(directoryPath);

Если вы не хотите, чтобы оно было syn c, вы можно использовать fs.promises с asyn c await

let res;
(async function() {
   res = await fs.promises.readdir("");
})();
0 голосов
/ 03 февраля 2020

Мы можем сделать это как метод обещания для запуска кода asyn c. Здесь мы не блокируем ни одного потока. Он будет работать асинхронно.

function getData(directoryPath) {
    return new Promise((resolve, reject) => {
        fs.readdir(directoryPath, function (err, files) {
            if (err) {
                reject('Unable to scan directory: ' + err.message);
            }
            dat = files.filter(item => item[1] == files.length);
            resolve(dat[0]);
         });
    });
 }

 getData(directoryPath).then((data) => {
     console.log(data);
 }).catch((err) => {
    console.error(err);
 });

 // or

 try {
     let data = await getData(directoryPath);
 } catch (error) {
     console.error(error);
 }
0 голосов
/ 03 февраля 2020

Я не рекомендую читать sync чтение, поскольку оно может заблокировать основное thread. Вы можете использовать функцию callback, передав ее как параметр другой функции.

 function getData(onSuccess, onError) {
     fs.readdir(directoryPath, function (err, files) {
        if (err) {
             onError('Unable to scan directory: ' + err);
        }
        dat = files.filter(item => item[1] == files.length);
        onSuccess(dat[0]);
     });
 }

 getData(function(data){
     console.log(data);
 }, function(error){
     //error here
 })
...