Angular JS 使用 $resource 并等待 promise 被解析

Angular JS using $resource and waiting for promise to be resolved

我写了这个服务,它使用 $resource 使用 github api

获取用户名
githubApiD3App.service('githubApiService', ['$resource', function($resource){
    this.GetuserNames = function(searchString){
        var githubAPI = $resource("https://api.github.com/search/users", {callback: "JSON_CALLBACK"}, {get: { method: "JSONP"}});

        return githubAPI.get({ q: searchString});
    };
}]);

我在我的控制器中这样做

$scope.githubData = githubApiService.GetuserNames($scope.searchString);

我知道正在 returned 承诺,但我似乎无法让我的服务在 returning 数据或我的控制器等待数据之前等待。就我现在的代码而言,我立即得到一个空对象作为响应。我试过像这样在我的控制器中使用 success

scope.githubData = githubApiService.GetuserNames($scope.searchString).success(callback());

在回调中我 return 数据。然而那是行不通的。我也尝试在我的服务中使用 .$promise 和 .then 配对,但这也不起作用。

话虽如此,我该怎么做才能使 $scope.githubData 不会被分配一个空对象或等待响应?

伙计,现在我无法安装 $resource,但我使用 $http 做了类似的事情。

看看这个:

githubApiD3App.service('githubApiService', ['$resource', function($resource){
    return $http.get("https://api.github.com/search/users?q=" + searchString);
    };
}]);

然后使用 then 我处理结果:

scope.githubData = githubApiService.GetuserNames('engineerKev').then(function(results){
console.log(results.data.items[0]);
});

并打印:

{
  "total_count": 1,
  "incomplete_results": false,
  "items": [
    {
      "login": "engineerKev",
      "id": 3943145,
      "avatar_url": "https://avatars.githubusercontent.com/u/3943145?v=3",
      "gravatar_id": "",
      "url": "https://api.github.com/users/engineerKev",
      "html_url": "https://github.com/engineerKev",
      "followers_url": "https://api.github.com/users/engineerKev/followers",
      "following_url": "https://api.github.com/users/engineerKev/following{/other_user}",
      "gists_url": "https://api.github.com/users/engineerKev/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/engineerKev/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/engineerKev/subscriptions",
      "organizations_url": "https://api.github.com/users/engineerKev/orgs",
      "repos_url": "https://api.github.com/users/engineerKev/repos",
      "events_url": "https://api.github.com/users/engineerKev/events{/privacy}",
      "received_events_url": "https://api.github.com/users/engineerKev/received_events",
      "type": "User",
      "site_admin": false,
      "score": 40.398766
    }
  ]
}

这个:

$scope.githubData = githubApiService.GetuserNames($scope.searchString);

'normal' $resource 用法是正确的。但是,当 $resourceJSONP 结合使用时,事情可能会变得有点奇怪。尝试做这样的事情(我添加了 isArray 并更改了操作名称以避免与 $resource.get 的潜在冲突):

githubApiD3App.service('githubApiService', ['$resource', function($resource){
    this.GetuserNames = function(searchString){
        var githubAPI = $resource("https://api.github.com/search/users", {callback: "JSON_CALLBACK"}, {getUsers: { method: "JSONP", isArray: true}});

        return githubAPI.getUsers({ q: searchString});
    };
}]);

然后在控制器中:

githubApiService.GetuserNames($scope.searchString).$promise.then(function(users){
    $scope.githubData = users;
});

这是一本关于这个主题的好书:http://www.bennadel.com/blog/2610-using-jsonp-with-resource-in-angularjs.htm

这是我对我的问题的回答。这不是完美的答案,只是因为我一开始就试图错误地处理承诺。这 blog post 帮助我更好地理解 promise 以及如何正确处理它们。

在我的应用程序的控制器中,我没有分配作用域变量 w/e 承诺返回,而是这样做了

githubApiService.getUsernames($scope.searchString).then(function(results){

    $scope.returnedUsers = results.data.items.splice(start, deleteCount);

    console.log($scope.returnedUsers);
});

我已经缩短了我的控制器的内容,但我基本上处理了 .then 回调函数中的所有数据操作。这一行

$scope.returnedUsers = results.data.items.splice(start, deleteCount);

既可以在回调中设置控制器中的变量,也可以用必要的数据填充它,以便在我执行 {{githubData}} 时可以在我的视图中输出。通过在回调函数中执行所有操作,我不再收到任何由于未定义变量而导致的错误。我收到错误是因为当我做这样的事情时

$scope.githubData = githubApiService.GetuserNames('engineerKev').then(function(results){
console.log(results.data.items[0]);
});
$scope.githubData.data.items.sort(sortFunction);

$scope.githubData 将是一个具有未定义属性的空对象。

这个故事的寓意,如果我仍然没有得到承诺,请编辑我的答案,就是在你的控制器的回调函数中处理你的承诺。