如何获得函数返回结果?

时间:2015-09-30 01:29:02

标签: javascript angularjs cordova callback

我正在开发一个文件阅读服务,如下所示:

Intent

然后像这样使用它:

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;
        });
    }
}

问题是无法返回数据。如何将数据返回?

2 个答案:

答案 0 :(得分:1)

您的问题是您实际上没有从readFile函数返回任何结果。您正在从回调函数返回数据但是如果您想到它...结果将返回到函数readFile本身并且它保留在该函数内部。你想要做的是返回函数readFile的整个结果,然后在你使用它的控制器中解析promise。这是代码:

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
    });

通常,当您使用服务来实现某种使用promises并返回结果的功能时,您应该始终返回promise对象,该对象可以在需要的任何地方解析。 我强烈建议您阅读promise objects的这个很好的解释。

答案 1 :(得分: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
});