【问题标题】:How to get function return result?如何获取函数返回结果?
【发布时间】:2015-09-30 01:29:01
【问题描述】:

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

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

问题是返回数据失败。我怎样才能把数据返回回来?

【问题讨论】:

  • 您的return service 似乎在readFile 函数可以运行之前将您跳出函数。我也看不到函数调用上的点符号是如何工作的/但这可能只是我的误解......
  • @sheriffderek 从我的控制台日志中,它显示它正在执行代码。但速度较慢,并且在数据变量的执行控制台日志之后。
  • 你需要查看 Javascript 中的 promises 是什么。 $cordovaFile.readAsText() 方法返回一个承诺,它们是异步的,这意味着你不能假设你传递给它们的 .then() 方法的函数中的代码会立即运行。如果这没有意义,请查看 Promise 的工作原理。

标签: javascript angularjs cordova callback


【解决方案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
    });

一般来说,当您使用服务来实现某种使用承诺并返回结果的功能时,您应该始终返回可以在任何需要的地方解析的承诺对象。 我强烈建议您阅读promise objects 的精彩解释。

【讨论】:

  • @GregL 感谢您的通知。我现在修好了。
【解决方案2】:

你的函数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
});

【讨论】:

    猜你喜欢
    • 2015-07-19
    • 1970-01-01
    • 2018-02-21
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多