我想要實現使用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 }];
});
看來你需要學習如何承諾的工作。你基本上說:「聲明var標記,稍後做些事情(),返回標記(聲明但未定義)」。在不知道你回到什麼的時候,很難告訴你應該如何使用諾言。您可以將該標記作爲稍後由承諾填充的對象返回,也可以僅返回承諾對象。無論哪種方式,您都需要編寫更多代碼來處理非阻塞函數調用。 –
謝謝@doogabides你能指出我正確的方向嗎? –