2016-04-25 11 views
2

この解決機能は他の場所でも使用でき、私は約束が拒否されたときになぜプロフィールページがまだ実行されているのか分かりません。このバグは、ログインしたり、ストレージからトークンを削除したり、プロファイルページに移動したりすることで発生しました。これはすべての認証手順を経てログアウトします。リダイレクションラインに当たっても、認証がクリアされているため、プロファイルページがロードされ、エラーがスローされます。角度解決は拒否されましたが、まだページがロードされています

あなたが提供できるヘルプはすばらしいでしょう。あなたがより多くの情報を必要とするかどうかを教えてください。それは却下さ約束を返さないとスローされません。

app.configを(「$ routeProvider」)

.when('/profile', { 
    templateUrl: '/templates/profile.html', 
    controller: 'ProfileController', 
    resolve: { 
     auth: function (SessionService) { 
      SessionService.resolve() 
     } 
    } 
}). 
otherwise({ 
    redirectTo: '/login' 
}) 

function resolve() { 
    if (self.isAuthenticated()) { 
     return $q.when({auth: true}) 
    } else { 
     $q.reject({auth: false}) 
      self.logout() // first we go here 
     } 
    } 
} 

function logout() { 
    var auth = self.storage() 
    if (...) { 
     ... 
    } else { 
     self.clearUserAuthentication() // then here 
     $location.path('/login') // it redirects here, but still initializes the profile controller 
    } 
} 

答えて

1

/profileルートは常にauthは常にそれを置くより良い解決の約束を返す(またはので、解決します例外)。正しいコードは次のようになります。

.when('/profile', { 
    templateUrl: '/templates/profile.html', 
    controller: 'ProfileController', 
    resolve: { 
     auth: function (SessionService) { 
      return SessionService.resolve() 
     } 
    } 
}). 

注意、それはauthハンドラリターンが約束することが非常に重要だということ。キーワードreturnを省略すると、暗黙的なreturn undefinedになります。これは無意味ですが、依然として解決済みの約束とみなされます。

+0

解決が失敗した場合でも$ q.rejectを返す必要がありますか? @dfsq – Kraken

+1

'SessionService.resolve()'は、解決または拒否される約束を返す必要があります。または、エラーを「投げる」(拒否と同じ) 'resolve'メソッドで' return $ q.reject({auth:false}) 'を追加する必要があることがわかります。 – dfsq

関連する問題