如何从filereader事件返回值?

时间:2015-03-20 15:14:06

标签: javascript

我试图绕着阅读器对象。

我有这个功能,目前我是console.log(this.result),但我希望在触发事件后返回它。

readFile = function(fs, filename){
    fs.root.getFile(filename, {}, function(fileEntry){
        //this object reads files.
        var reader = new FileReader();
        //register callback for read files
        reader.onloadend=function(e){
            //this is what i want to return
            console.log(JSON.parse(this.result));
        };

        //read file-function
        fileEntry.file(function(file){
            reader.readAsText(file);
        },errorHandler);

    },errorHandler);
};

简单地按照这样的方式重新启动它就不会起作用

readFile = function(fs, filename){
    fs.root.getFile(filename, {}, function(fileEntry){
        //this object reads files.
        var reader = new FileReader();
        //register callback for read files
        reader.onloadend=function(e){
            //this is what i want to return
            return JSON.parse(this.result);
        };

        //read file-function
        fileEntry.file(function(file){
            reader.readAsText(file);
        },errorHandler);

    },errorHandler);
};

console.log(readFile(foo, bar))将输出未定义的内容,似乎在reader.onloadend运行之前触发了返回。

1 个答案:

答案 0 :(得分:0)

我通过传递回调来返回值:

readFile = function(fs, filename, callback){
    if(!fs){
        console.log('no filesystem registered')
        return;
    }
    fs.root.getFile(filename, {}, function(fileEntry){
        //this object reads files.
        var reader = new FileReader();
        //register callback for read files
        reader.onloadend =  function(e){
            callback(JSON.parse(this.result))
        };

        //read file-function
        fileEntry.file(function(file){
            reader.readAsText(file);
        },errorHandler);

    },errorHandler);
};

errorHandler = function(e) {
  console.log('Error: ', e);
};