我编写了这个使用$ 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没有被分配一个空对象或等待响应?
答案 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将是一个具有未定义属性的空对象。
故事的道德,如果我还没有得到承诺,请编辑我的答案,就是在控制器的回调功能中处理你的承诺。