2017-02-16 175 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); 

但它总是返回未定义! getUrl()中的console.log显示良好的值。它看起来像导出没有等待函数getURl加载。解决这个问题的最好方法是什么?在这个例子中,我删除了所有不必要的代码部分。

+0

这是正确的,'readFileSync'是异步的。你可以解决这个问题,因为你还没有发布调用'getFile'的代码,所以我们不知道你会怎么做,或者你可以使用同步的'readFile'来代替。 – adeneo

+0

也许使用'readFile'而不是'readFileSync':http://stackoverflow.com/a/22863818/6429774 – Phil

+1

你必须在'functions.js'中定义'resetUrl'变量 –

回答

0

我认为,functions.js出口应exports.resetUrl = url1

编辑

你必须尝试新的方法,因为getUrl方法执行异步操作,所以设定url1之前,你做的exports.resetUrl = url1,所以它始终是未定义的。

我建议你补充一点,可以在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; 

然后访问使用一些callback参数getUrl功能,你可以做test.js

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

这只是我首先想到的一种选择。我希望你明白这一点,并明白为什么你的案例中的url1一直未定义。

+0

您可以在'exports'之前添加'console.log(url1)'并告诉它打印什么 – piotrbienias

+0

是的,函数getUrl中的console.log返回正确的值。导出前的console.log返回undefined。 – Janp95

+0

我更新了答案,检查了一下,并告诉它是否可以帮助你以某种方式 – piotrbienias