2017-02-11 12 views
0

私はスタックオーバーフローに関するこれらの質問が100万あることを認識しています。それはいつも誰かが約束を返さない状況のようです。これは今の場合ではありません...私は確かに約束を私のLoginFactoryに戻しています。ログインポストを行うと、コントローラからエラーが発生します。私はこれが私のスクリプトでいくつかの奇妙なバンドリングと小型化エラーであると仮定することができます。しかし、私は新しい角度になっています。t.then()は関数ではありません。しかし、遅延されたobject.promiseが返されています

なぜ、遅延オブジェクトを返さないという不満はありますか?縮小さスクリプトの追加

var LoginFactory = function ($http, $q) { 
console.log("calling login factory constructor"); 
return function (emailAddress, password, rememberMe) { 
    var deferredObject = $q.defer(); 

    $http.post('/Account/Login', { 
     Email: emailAddress, 
     Password: password, 
     RememberMe: rememberMe 
    }).success(function (data) { 
     console.log("in success", data); 
     if (data === "True") { 
      deferredObject.resolve({ success: true }); 
     } else { 
      deferredObject.resolve({ success: true }); 
     } 
    }).error(function() { 
     console.log("in error"); 
     deferredObject.resolve({ success: false }); 
    }); 
    console.log("returning deferred object", deferredObject); 
    return deferredObject.promise; 
} 
} 

LoginFactory.$inject = ['$http', '$q']; 


var LoginController = function ($scope, $routeParams) { 
$scope.loginForm = { 
    emailAddress: '', 
    password: '', 
    rememberMe: false, 
    returnUrl: $routeParams.returnUrl 
}; 

$scope.login = function() { 
    var result = LoginFactory($scope.loginForm.emailAddress, $scope.loginForm.password, $scope.loginForm.rememberMe); 
    console.log("result in login func",result); 
    result.then(function (result) { 
     if (result.success) { 
      if ($scope.loginForm.returnUrl !== undefined) { 
       $location.path('/routeOne'); 
      } else { 
       $location.path($scope.loginForm.returnUrl); 
      } 
     } else { 
      $scope.loginForm.loginFailure = true; 
     } 
    }); 
} 
} 

LoginController.$inject = ['$scope', '$routeParams', '$location', 'LoginFactory']; 

enter image description here

。返品約束は奇妙に見えます。それが正しいだ場合、私は知っているのに十分なjsのに慣れていないよ

LoginFactory = function(n, t) { 
return console.log("calling login factory constructor"), 
    function(i, r, u) { 
     var f = t.defer(); 
     return n.post("/Account/Login", { 
      Email: i, 
      Password: r, 
      RememberMe: u 
     }).success(function(n) { 
      console.log("in success", n); 
      n === "True" ? f.resolve({ 
       success: !0 
      }) : f.resolve({ 
       success: !0 
      }) 
     }).error(function() { 
      console.log("in error"); 
      f.resolve({ 
       success: !1 
      }) 
     }), console.log("returning deferred object", f), f.promise 
    } 
}; 
LoginFactory.$inject = ["$http", "$q"]; 

答えて

0

これは、いわゆるジョンパパスタイルの下にあり、$inject注釈です。

複数のスコープで同じ名前を持つ結果になります(「角度スコープ」ではなく「関数スコープ」のように)。匿名の関数や配列アノテーションでは決して起こりません。

機能注釈や関数のシグネチャが一致しない:

var LoginController = function ($scope, $routeParams) { ... } 

LoginController.$inject = ['$scope', '$routeParams', '$location', 'LoginFactory']; 

これは、工場出荷時の機能ではなく、インスタンスで親スコープからLoginFactoryを得ることになります。したがって、LoginFactory(...)呼び出しの結果は関数であり、約束ではありません(これはconsole.logの出力です)。

それは

var LoginController = function ($scope, $routeParams, $location, LoginFactory) { ... } 

2つのことは、これが再び起こらせないように行うことができなければなりません。

1つは変数の代わりに名前付き関数を使用するため、$inject注釈を吊り上げることができます。これにより、アノテーションと関数シグネチャを並べて並べることができます。

LoginController.$inject = ['$scope', '$routeParams', '$location', 'LoginFactory']; 

function LoginController ($scope, $routeParams, $location, LoginFactory) { ... } 

もう1つはTDDです。あなたがアプリを書くと同時にユニットテストを書く。これにより、潜在的な原因を排除して、ルーキーミスを見つけ出し、複雑なミスを推測することができます。 LoginControllerが書かれた時点でLoginFactoryがすでにテストされていた場合、DIが間違っていたことは間違いありません。

また、上記のコードでは、非推奨のsuccessメソッドとを追加しました。

0

あなたはdeferredObject(ないdeferredObject.promise) を返さなければならないし、その結果にresult.promise.then

は、関数のときの約束に実行されますかロードされている

+0

これはほぼ同じようです。私はちょうどそれを試みたが、まったく同じエラーを取得しています。基本的に「約束」は定義されていないと言っています。 変更: 'return deferredObject;'& 'result.promise.then(function(result){' – Adrian