Angular JS使用$ resource并等待promise得到解决

时间:2016-04-15 19:34:37

标签: javascript angularjs get angular-resource angular-services

我编写了这个使用$ 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);

我知道正在退回承诺,但我似乎无法在返回数据或我的控制器等待数据之前等待我的服务。正如我的代码现在所示,我立即得到一个空对象作为响应。我已尝试在我的控制器中成功使用

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

在回调中我返回数据。然而,这不起作用。我也试过在我的服务中使用。$ promise与.then配对,但这也不起作用。

所以说,我可以这样做,$ scope.githubData没有被分配一个空对象或等待响应?

3 个答案:

答案 0 :(得分:1)

伙计,现在我无法安装$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
    }
  ]
}

答案 1 :(得分:1)

此:

create or replace and compile java source named testx509src
 as
  import java.security.cert.*;
  import java.io.*;
  import java.sql.*;
  import oracle.sql.BLOB;
  import oracle.sql.NUMBER;

  public class TestX509 {
      public static NUMBER getSerialNumber(BLOB cert)
              throws SQLException, IOException, CertificateException {

          Connection conn = (Connection) DriverManager.getConnection("jdbc:default:connection:");
          BufferedInputStream is = new BufferedInputStream(cert.getBinaryStream());

          CertificateFactory cf = CertificateFactory.getInstance("X.509");
          X509Certificate c = (X509Certificate) cf.generateCertificate(is);
          is.close();

          return new oracle.sql.NUMBER(c.getSerialNumber()); 

      }
  }
/

CREATE OR REPLACE FUNCTION CERT_getSerialNumber(cert in blob)
  RETURN NUMBER
  AS LANGUAGE JAVA
  NAME 'TestX509.getSerialNumber(oracle.sql.BLOB) return oracle.sql.NUMBER';
/

SQL> select CERT_GetSerialNumber(cert) serial from cert_storage where id = 1;

serial
-----------------------
243435653237

对于“正常”$scope.githubData = githubApiService.GetuserNames($scope.searchString); 用法是正确的。但是,将$resource$resource结合使用时,事情可能会变得有点时髦。尝试做这样的事情(我添加了JSONP并更改了操作名称,以避免与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});
    };
}]);

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

答案 2 :(得分:1)

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

在我的应用程序的控制器中,而不是分配范围变量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将是一个具有未定义属性的空对象。

故事的道德,如果我还没有得到承诺,请编辑我的答案,就是在控制器的回调功能中处理你的承诺。