2015-05-18 101 views
0

我想要实现使用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 }]; 
     }); 
+0

看来你需要学习如何承诺的工作。你基本上说:“声明var标记,稍后做些事情(),返回标记(声明但未定义)”。在不知道你回到什么的时候,很难告诉你应该如何使用诺言。您可以将该标记作为稍后由承诺填充的对象返回,也可以仅返回承诺对象。无论哪种方式,您都需要编写更多代码来处理非阻塞函数调用。 –

+0

谢谢@doogabides你能指出我正确的方向吗? –

回答

2

完全重写

可悲的是,我想简短的答案是,你不能用承诺以$ httpBackend。看到这个讨论:https://github.com/angular/angular.js/issues/11245

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

ngMock的单元测试版不处理的承诺。如果您正在使用一个版本的$ httpBackend,它可以处理的承诺,你需要返回的承诺,而不是[200,“状态”。

但是,这么说,你重写,还重用了同样的承诺后,已经解决了这是不正确。您只能解决或拒绝延期一次。所以你需要链接你的then()函数或者创建一个新的延迟。此外,您实际上并不需要创建延迟,因为newToken()函数实际上会返回一个承诺。

+0

其实不是真的。提供了一点清晰,但我仍然无法得到它的工作。我也编辑了我的代码以及@doogabides –