Javascript 在AngularJS中异步调用hprose.httpclient
我有一台Hprose服务器,它处理用户身份验证。我正在尝试编写一个logonService,它在用户登录后返回一个UserInfo对象。在下面的代码中,hprose.HttpClient.login()是异步调用的,需要几秒钟,但controller中的代码在创建logonService实例后继续运行。因此$scope.user始终为null,并且永远不会调用logonService.logon()。我尝试使用$http.get,但无法理解如何使用Hprose而不是示例代码中的http来获取Promise obj。在谷歌搜索并没有得到任何有用的结果。有人知道该怎么做吗?谢谢Javascript 在AngularJS中异步调用hprose.httpclient,javascript,angularjs,asynchronous,promise,angular-promise,Javascript,Angularjs,Asynchronous,Promise,Angular Promise,我有一台Hprose服务器,它处理用户身份验证。我正在尝试编写一个logonService,它在用户登录后返回一个UserInfo对象。在下面的代码中,hprose.HttpClient.login()是异步调用的,需要几秒钟,但controller中的代码在创建logonService实例后继续运行。因此$scope.user始终为null,并且永远不会调用logonService.logon()。我尝试使用$http.get,但无法理解如何使用Hprose而不是示例代码中的http来获取Pr
var app = angular.module("myApp",[])
.service("logonService", function() {
var httpclient = new hprose.HttpClient("http://testurl.com:4800/webapi/", ["login"]);
httpclient.login("userid", "ppt", function(sid) {
console.log("sid1="+sid);
}
this.logon = function() {
console.log("here I am");
return something;
}
})
.controller("myCtrl", ["logonService", function(logonService) {
var user = logonService.logon();
$scope.user = user;
}
)
部分问题是
myCtrl
中的代码没有等待logonService.logon()的异步结果。另外,我们不知道httpclient.login()
是否返回承诺或什么。所以我们需要用$q承诺来包装它
var app = angular.module("myApp",[])
app.service("logonService", function() {
var loginURL = "http://testurl.com:4800/webapi/";
var httpclient = new hprose.HttpClient(loginUrl, ["login"]);
// wrap login fn w/ new $q promise
this.logon = function(userid, ppt) {
return $q(function(resolve,reject){
httpclient.login(userid, ppt, function(sid) {
console.log("sid1="+sid);
// resolve or reject fn based on results passed to callback
if (sid) {
resolve(sid);
} else {
reject('sid wasn\'t defined!');
}
})
}
}
})
app.controller("myCtrl", ["logonService",
function(logonService) {
logonService.logon(userid, ppt).then(function(user){
// assign user to scope only after promise resolved
// 'user' arg will be whatever passed to 'resolve' above
$scope.user = user;
})
.catch(function(e){
console.log('An Error happened: ' + e)
// logon server was down, etc.
})
}
])
是AngularJS“$q
的好参考。这将让你知道如何在任何情况下创造承诺
希望这对你有所帮助
var app = angular.module("myApp",[])
app.service("logonService", function() {
var loginURL = "http://testurl.com:4800/webapi/";
var httpclient = new hprose.HttpClient(loginUrl, ["login"]);
this.logon = function(userid, ppt) {
// the result of httpclient.login is already a promise object.
return httpclient.login(userid, ppt);
}
})
app.controller("myCtrl", ["logonService",
function(logonService) {
logonService.logon(userid, ppt).then(function(user){
// assign user to scope only after promise resolved
// 'user' arg will be whatever passed to 'resolve' above
$scope.user = user;
})
.catch(function(e){
console.log('An Error happened: ' + e)
// logon server was down, etc.
})
}
])
httpclient.login的结果已经是一个promise对象,因此您不需要使用$q来包装它。您确定是指logonService.logon()
?如前所述,这是一个承诺,不是一个方法。更好,但括号/大括号需要排序。服务的最后四行仍然是错误的。缺少一个“)”并且所有四个都应该有分号。无论如何,这是为了说明这个概念,而不是为了所有的帮助而剪切粘贴fixthanx。我得到了它。