javascript - 在 AngularJS 中异步调用 hprose.httpclient

标签 javascript angularjs asynchronous promise angular-promise

我有一个处理用户身份验证的 Hprose 服务器。我正在尝试编写一个 logonService,它在用户登录后返回一个 UserInfo 对象。在下面的代码中,hprose.HttpClient.login() 被异步调用并且需要几秒钟,但是 Controller 中的代码在创建 logonService 实例后继续运行。因此 $scope.user 始终为空,并且永远不会调用 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() 是否返回 promise 或什么。所以我们需要将它包装在 $q promise 中。

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.
        })
    }
])

Here是 AngularJS 的 $q 很好的引用。这会让你知道如何在任何情况下创建 Promise。

希望对您有所帮助。

关于javascript - 在 AngularJS 中异步调用 hprose.httpclient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26385862/

相关文章:

javascript - ReactJS - 子组件在使用导入组件时不会渲染,但在父元素中显式标记时会渲染

javascript - 使用 addEventListener Javascript 重置 setTimeout

javascript - 将字符串转换为数字

javascript - Angular $cookieStore 服务 - 与子域共享 cookie

javascript - 等待破坏秩序

javascript - 异步功能不会第二次弹出

javascript - 上传多个文件夹

javascript - 将 json 输出中的变量映射到字符串中的位置

node.js - 如何使用数据库(mongodb)使我的代码更简单?

javascript - 使用 ionic 中的 angularjs 创建和更新全局列表