2015-05-18 35 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 –