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 }];
        });
4

1 に答える 1

2

完全な書き直し

残念ながら、短い答えは、$httpBackend では promise を使用できないということだと思います。このディスカッションを参照してください: https://github.com/angular/angular.js/issues/11245

私の最初の回答では、あなたが $httpBackend モックを使用していることに気付きませんでした。私は単に間違ったプロミス コードに集中していたからです。promise に関する情報 ( https://docs.angularjs.org/api/ng/service/$q ) は引き続き有効です。

ngMock の単体テスト バージョンは promise を処理しません。promise を処理できるバージョンの $httpBackend を使用している場合は、[200, "status"] ではなく、promise を返す必要があります。

ただし、そうは言っても、あなたの書き直しでは、解決された後に同じ約束を再利用しますが、これは正しくありません。延期を解決または却下できるのは 1 回だけです。したがって、関数をチェーンするかthen()、新しい defer を作成する必要があります。newToken()また、関数は実際に promise を返すため、実際に defer を作成する必要はありませんでした。

于 2015-05-18T18:18:57.847 に答える