2017-01-28 3 views
1

Я следую Electron файловой системы учебник здесь:Повторные данные функции Js не приезжая в вызове функции

How to choose , read, save, delete or create a file with Electron Framework

который включает в себя следующий код, чтобы вытащить диалоговое окно загрузки файла:

 document.getElementById('select-file').addEventListener('click',function(){ 
      dialog.showOpenDialog(function (fileNames) { 
       if(fileNames === undefined){ 
        console.log("No file selected"); 
       }else{ 
        document.getElementById("actual-file").value = fileNames[0]; 
        readFile(fileNames[0]); 
        // myData = readFile(fileNames[0]); <--- 
       } 
      }); 
     },false); 

И следующий код для фактического чтения файла:

 function readFile(filepath) { 
      fs.readFile(filepath, 'utf-8', function (err, data) { 
       if(err){ 
        alert("An error ocurred reading the file :" + err.message); 
        return; 
       } 

       document.getElementById("content-editor").value = data; 
      }); 
     } 

Как вы можете видеть, последняя строка обновляет DOM с импортированными данными. Тем не менее, я хочу вернуть данные в свою вызывающую функцию, потому что это не HTML. Обратите внимание на прокомментированную строку в конце первого отрезка. Это то, что я хочу сделать.

Это фактически XML, который нужно обработать, а не сбрасывать в DOM. Но все мои попытки вернуть данные (в частности, «вернуть данные», либо там, где последняя строка, либо до окончательной фигурной скобки), не удались. Ни один из них не приводит к тому, что вызывающая функция получает данные.

Возможно ли, что вызывающая функция должна дождаться завершения этого? Или, скорее всего, я просто не возвращаю данные правильно из этого типа функции. Буду признателен за любую оказанную помощь.

ответ

0

Поскольку ваш readFile(filepath) выполняет файл асинхронной операции чтения, вы не можете использовать простой возврат здесь. Однако вы можете передать обратный вызов своей функции readFile и называть ее позже, когда ваша операция чтения будет завершена данными. Как это.

Создание обратного вызова

function fileReadComplete(data) { 
    myData = data; 
    // Do whatever you want 
} 

и А называют его.

readFile(fileNames[0], fileReadComplete); 

Изменение функции ReadFile:

function readFile(filepath, callback) { 
     fs.readFile(filepath, 'utf-8', function (err, data) { 
      if(err){ 
       alert("An error ocurred reading the file :" + err.message); 
       return; 
      } 
      callback(data); 
      document.getElementById("content-editor").value = data; 
     }); 
    } 
+0

Это сработало хорошо. Таким образом, я могу также вызвать его из ctrl-L, а также меню «Файл» и щелкнуть правой кнопкой мыши по фону. Это должно позволить мне сделать все это. Благодарю. –

0

Насколько я понял, это должно делать то, что вы хотите.

// Обновление; изменен с «возврат» на функцию обратного вызова.

document.getElementById('select-file').addEventListener('click',function(){ 
     dialog.showOpenDialog(function (fileNames) { 
      if(fileNames === undefined){ 
       console.log("No file selected"); 
      }else{ 
       document.getElementById("actual-file").value = fileNames[0]; 


       readFile(fileNames[0], function(myData){ 
       console.log(myData); 
       }); 

      } 
     }); 
    },false); 

    function readFile(filepath, callBack) { 
     fs.readFile(filepath, 'utf-8', function (err, data) { 
      if(err){ 
       alert("An error ocurred reading the file :" + err.message); 
       return; 
      } 
      callBack(data); 
      //document.getElementById("content-editor").value = data; 
     }); 
    } 
+0

Это не будет работать, 'fs.readFile' является функцией асинхронной и функция ReadFile будет немедленно вернуться без значения. – abhishekkannojia

+0

Проверьте мое обновление, вместо этого он использует обратный вызов. – user2267175