等到fs.readFileSync完成

时间:2017-02-16 08:31:59

标签: javascript node.js

在我的文件functions.js中我有两个函数:

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加载。解决这个问题的最佳方法是什么?在这个例子中,我删除了所有不必要的代码部分。

1 个答案:

答案 0 :(得分:0)

我认为functions.js的导出应为exports.resetUrl = url1

修改

您必须尝试其他方法,因为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在你的案例中一直没有定义。