2017-02-16 5 views
0

в моем файле functions.js у меня есть две функции:Подождите, пока fs.readFileSync делается

var email, url1 

function getFile(_callback){ 
    email = fs.readFileSync("C:/Emails/" + items[2]) 
    _callback(email);  
} 

function getUrl(){ 
    getLatestMail(function(email) { 
      email.split(/\n/).forEach(function(line) { 
      i++; 
      if (i == 52) { 
       var test = new Buffer(line, 'base64').toString(); 
       var regex = /=(.+?)"/g 
       var result1 = regex.exec(test); 
       url1 = result1[1].toString(); 
       console.log(url1); 

     } 

    }); 

getUrl() 
exports.resetUrl = url1; 

И у меня есть файл test.js

var Functions = require('../pageobjects/functions.js'); 
var test = Functions.resetUrl; 
console.log(test); 

Но всегда возвращает неопределенное! Консоль.log в getUrl() показывает хорошее значение. Похоже, что экспорт не ждет загрузки функции getURl. Каков наилучший способ решить эту проблему? В этом примере я удалил все ненужные части кода.

+0

Правильно, 'readFileSync' является асинхронным. Вы можете либо обойти это, и, так как вы не разместили код, который вызывает 'getFile', мы бы понятия не имели, как вы это сделаете, или вместо этого вы можете использовать синхронный' readFile'. – adeneo

+0

Возможно, используйте 'readFile' вместо' readFileSync': http://stackoverflow.com/a/22863818/6429774 – Phil

+1

Вы должны определить переменную 'resetUrl' в' functions.js' –

ответ

0

Я думаю, что экспорт functions.js должен быть exports.resetUrl = url1

EDIT

Вы должны попробовать другой подход, поскольку getUrl метод выполняет асинхронную операцию, поэтому перед url1 установлен, вы делаете exports.resetUrl = url1, так он всегда будет неопределенным.

Я предлагаю вам добавить callback параметр в getUrl функцию, которая может быть использована в test.js файле для того, чтобы получить доступ к url1 значению

function getUrl(callback){ 
    getLatestMail(function(email) { 
     email.split(/\n/).forEach(function(line) { 
     i++; 
     if (i == 52) { 
      var test = new Buffer(line, 'base64').toString(); 
      var regex = /=(.+?)"/g 
      var result1 = regex.exec(test); 
      url1 = result1[1].toString(); 
      console.log(url1); 
      // and here use the callback 
      callback(url1); 
     } 
    }); 
}); 

exports.resetUrl = getUrl; 

Тогда вы могли бы сделать в test.js

var Functions = require('../pageobjects/functions.js'); 
Functions.resetUrl(function(url1){ 
    console.log(url1); 
}); 

Это только один из вариантов, который мне впервые пришел в голову. Надеюсь, что вы поняли, почему url1 в вашем случае было неопределенным все время.

+0

Можете ли вы добавить 'console.log (url1)' непосредственно перед 'export' и сообщить, что он печатает – piotrbienias

+0

Да console.log в функции getUrl возвращает правильное значение. Консоль.log перед экспортом возвращает undefined. – Janp95

+0

Я обновил ответ, проверю его и скажу, поможет ли он вам как-то – piotrbienias

Смежные вопросы