2015-09-30 128 views
2

我开发这个样子文件阅读服务:如何获取函数返回结果?

angular.factory('fileService', fileService); 

function fileService($cordovaFile){ 
    var service = { 
     readFile: readFile 
    }; 

    return service; 

    /////////////// 

    function readFile(path, file){ 
     $cordovaFile.readAsText(path, file) 
     .then(function (success) { 
      console.log("read file success"); 
      console.log(success); 
      return success; 
     }, function (error) { 
      alert("Fail to read file:"+error); 
      console.log("Fail to read file"); 
      console.log(error); 
      return false; 
     }); 
    } 
} 

,然后用它是这样的:

var data = fileService.readFile(cordova.file.dataDirectory,filename); 
console.log(data) //return undefined 

问题是,它无法返回的数据。我怎样才能得到数据返回?

+0

看起来你的'return service'可以在'readFile'函数运行之前跳出函数。我也没有看到函数调用的点符号是如何工作的,但这可能只是我的误解... – sheriffderek

+0

@sheriffderek从我的控制台日志中,它显示它正在执行代码。但是它比数据变量的执行控制台日志更慢。 – user1995781

+1

你需要查看Javascript中的_promises_是什么。 '$ cordovaFile.readAsText()'方法返回一个promise,它们是异步的,这意味着你不能假设你传递给它的'.then()'方法的函数中的代码会立即运行。如果这没有意义,请查看Promise如何工作。 – GregL

回答

1

你的问题是你实际上没有返回readFile函数的任何结果。你从回调函数中返回数据,但是如果你想到它的话......那个结果会返回给函数readFile本身,并且它保留在该函数中。你想要做的是返回函数readFile的整个结果,然后解析你使用它的控制器中的承诺。下面是代码:

angular.factory('fileService', fileService); 

function fileService($cordovaFile){ 
     var service = { 
     readFile: readFile 
    }; 

    return service; 

    function readFile(path, file){ 
     return $cordovaFile.readAsText(path, file); 
    } 
} 

然后你使用这样的:

var data = fileService.readFile(cordova.file.dataDirectory,filename); 
data.then(function (success) { 
     // Do whatever you need to do with the result 
    }, function (error) { 
     /// Handle errors 
    }); 

在一般情况下,当您使用服务来实现某种使用的承诺,并返回结果的功能,你应该总是返回可以在任何需要的地方解析的promise对象。 我强烈建议您阅读promise objects的这个很好的解释。

+0

@GregL感谢您的通知。我现在修好了。 –

0

你的函数readFile没有返回值,所以,首先你应该返还承诺:

function readFile(path, file) { 
    return 
    $cordovaFile.readAsText(path, file).then(function (success) { 
     console.log('Read file success'); 
     console.log(success); 
     return success; 
    }, function (error) { 
     alert('Fail to read file: ' + error); 
     console.log('Fail to read file'); 
     console.log(error); 
     return false; 
    }); 
} 

然后,如果你尝试使用它你的方式,你会不会得到未定义的了,你会得到一个承诺。

但是由于这是一种异步方法,您将会得到这个承诺,但您可能不想这么做,因为您需要承诺的履行价值。所以,你应该像这样使用它:

fileService.readFile(cordova.file.dataDirectory, filename).then(function(data) { 
    // use data here 
});