Javascript Angular服务从本地文件获取JSON无效

Javascript Angular服务从本地文件获取JSON无效,javascript,json,angularjs,Javascript,Json,Angularjs,我尝试创建一个从本地JSON文件获取数据的服务,但它不起作用,也没有解释为什么不起作用 这个。以下是我的服务代码: webTestApp.factory('webtest', function($q, $timeout, $http) { var Webtest = { fetch: function(callback) { var ret = function() { $http.get('webtest.json

我尝试创建一个从本地JSON文件获取数据的服务,但它不起作用,也没有解释为什么不起作用

这个。以下是我的服务代码:

webTestApp.factory('webtest', function($q, $timeout, $http) {
    var Webtest = {
        fetch: function(callback) {
            var ret = function() {
                $http.get('webtest.json').success(function(data) {
                    return data;
                });
            };

            return ret();
        }
    };
    return Webtest;
});
上面的Plunkr正是我在我的项目中所做的,但我在有人得到同样的东西的地方分叉。 我在这里找到的

这是一个工作版本

webTestApp.factory('webtest', function($q, $timeout, $http) {
    var Webtest = {
        fetch: function(callback) {

            var deferred = $q.defer();

            $timeout(function() {
                $http.get('webtest.json').success(function(data) {
                    deferred.resolve(data);
                });
            }, 30);

            return deferred.promise;
        }
    };

    return Webtest;
});

我的问题是,为什么我的版本(第一个块)不起作用,而第二个块起作用?

您使用
ret
函数将其过度复杂化。下面是您的代码的简化版本,其中我只返回$http call返回的承诺:

要使您的版本正常工作,您的
ret
函数需要返回一些内容($http是一个异步调用,所以它的成功与否并不重要,实际上回调会返回一些内容):

然后,解析$http承诺时,实际的数据内容在
response.data
中,而不仅仅是
response
(完整的
response
实际上包含头和其他与服务器调用相关的信息)。以下是您的原始版本和这两个修复程序:


您编写的第二个示例之所以有效,是因为它返回了一个简单的$q承诺(这就是为什么
$scope.data
有效,而
$scope.data.data
不需要),但它代表了一个,所以您应该坚持原来的方法(或者使用我在第一段中给您的简化版本).

因为您没有从函数返回承诺:
返回$http.get…
嗯?因此,如果我在
$http.get…
之前添加
return
,它应该可以工作吗?我试过了,但还是不起作用。正如我所说,有两件事需要解决:
返回
,和
响应.data
(在您的例子中,
$scope.data.data
)。很明显,它在我的plunker中起作用:。$http调用返回的承诺与$q承诺略有不同然后()在控制器中调用就足够了。如果您想在返回数据之前修改数据或其他内容,可以在服务中使用
success
(或
then
)。在这里查看服务,这就是您所需要的:因为它将返回未定义的。请记住,当我们第一次调用$http函数时,它会立即返回承诺(远远早于它实际到达所需的文件)!因此,promise.data将是未定义的,而scope变量将保持不变,而如果我们返回promise本身,那么一旦promise被解析或拒绝,scope变量将得到更新。
        var ret = function() {
            return $http.get('webtest.json').success(function(data) {
      // this ^^ is the key
                return data;
            });
        };