$ httpBackend返回promise值问题

时间:2015-05-18 17:34:44

标签: angularjs angular-promise httpbackend

我想使用AngularJS实现登录功能,我的后端在Rails中。我决定使用$ httpBackend实现它,但我遇到了问题。

当它进入$ httpBackend函数时,它会使用数据库中的最新令牌更新令牌,但是我需要将值返回到我的服务,而这似乎不会发生。我知道这与承诺和推迟等有关,但我不熟悉那些。

这是我的代码

  var authorized = false;
    var token;

    $httpBackend.whenPOST('https://login').respond(function(method, url, data) {
            var loginDetails = data;
            var d= $q.defer();

            function startToken(loginDetails) {
          getTokens.newToken(loginDetails).then(function(result) {
            if(result.length > 0) {
              var updateDB = "UPDATE preferences SET value='"+result[0].token+"' WHERE description='token'";
              $cordovaSQLite.execute(db, updateDB).then(function(res) {
                var updateDB1 = "UPDATE preferences SET value='true' WHERE description='logged_in'";
                $cordovaSQLite.execute(db, updateDB1).then(function(res) {
                  var query = "SELECT description, value FROM preferences";
                  $cordovaSQLite.execute(db, query).then(function(res) {
                    if(res.rows.length > 0) {
                      if(res.rows.item(3).value!=null || res.rows.item(3).value!='') {
                        getTokens.getCRMToken(res.rows.item(2).value).then(function(resulttoken){
                          if(resulttoken[0].token == res.rows.item(3).value) {
                            token = res.rows.item(3).value;
                          }
                        d.resolve(token)
                        });  
                      } 
                    } else {
                      console.log("No results found");
                    }
                  }, function (err) {
                      console.error(err);
                  }); 
                }, function (err) {
                  console.error(err);
                });

              }, function (err) {
                console.error(err);
              });  
            }
            else {
              console.log("reject")
              d.reject(result);
            }   
          }, 1000);
          return d.promise;
        }

        var a = startToken(loginDetails).then(function(token) {
    // in here the value for token is correct i then go ahead to set the value for authorized and resolve it           
          console.log(token)
              if(token.length > 0){
                console.log("authorized true")
                authorized = true;
                d.resolve(token, authorized)

              }
              else
              {
                console.log("authorized false")
                authorized = false;
                d.reject(token, authorized)
              }
              return d.promise;
        })

// this is where i have my issue. all i want to do is to just check if the value for authorized is true, if yes, return the value for token. 
                //authorized = true;
                //return  [200 , { authorizationToken: token }];
        });

1 个答案:

答案 0 :(得分:2)

完成重写

可悲的是,我认为简短的回答是你不能在$ httpBackend中使用promises。请参阅此讨论:https://github.com/angular/angular.js/issues/11245

在我原来的回答中,我没有意识到您使用的是$ httpBackend模拟,因为我只是专注于您不正确的承诺代码。有关承诺的信息(https://docs.angularjs.org/api/ng/service/$q)仍然有效。

ngMock的单元测试版本不处理承诺。如果您使用的$ httpBackend版本可以处理承诺,则需要返回承诺,而不是[200,“status”]。

然而,这就是说,在你的重写中,你也可以在解决后重复使用相同的promise,这是不正确的。您只能解决或拒绝延期一次。因此,您需要链接newToken()函数或创建新的延迟。此外,您实际上并不需要创建延迟,因为{{1}}函数实际上会返回一个promise。