Javascript 在AngularJS中异步调用hprose.httpclient

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

我有一台Hprose服务器,它处理用户身份验证。我正在尝试编写一个logonService,它在用户登录后返回一个UserInfo对象。在下面的代码中,hprose.HttpClient.login()是异步调用的,需要几秒钟,但controller中的代码在创建logonService实例后继续运行。因此$scope.user始终为null,并且永远不会调用logonService.logon()。我尝试使用$http.get,但无法理解如何使用Hprose而不是示例代码中的http来获取Promise obj。在谷歌搜索并没有得到任何有用的结果。有人知道该怎么做吗?谢谢

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。我得到了它。