バックエンド サービスに対してユーザーの資格情報をチェックする角度サービスに ajax 関数があります。呼び出しをかなり単純化しました。$http サービスを使用して AJAX リクエストを発行すると、Promise API は正しく動作します。
function isOnline(){
return $http.get(constants.dataUrl)
.success(function(){return})
.error(function(){return;});
}
function checkCredentials(){
var online = isOnline();
var checkCreds = online.then(function(){
alert("Get succeeded");
},
function(response){
alert("Get did not succeed");
});
return checkCreds;
}
で定義された関数が呼び出されます。ただし、jQuery ajax メソッドを使用すると、resolve メソッドと defer メソッドが伝播されず、online.then の正しいメソッドが起動されないようです。以下のコードは機能しません。
function isOnline(){
var defer = $q.defer();
$.ajax({
url: constants.dataUrl,
dataType: 'json',
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', basicAuthenticationToken());
},
error: function (xhr, ajaxOptions, thrownError) {
alert("I am not online");
defer.reject("I am not online");
},
success: function (data) {
alert("I am online");
defer.resolve(data);
}
});
return defer.promise;
}
function checkCredentials(){
var online = isOnline();
var checkCreds = online.then(function(){
alert("Get succeeded");
},
function(response){
alert("Get did not succeed");
});
return checkCreds;
}
promise API を通常の jQuery ajax メソッドで使用することはできませんか? これらの呼び出しを置き換えたい理由は、Angular $http では機能しないように見える複雑な PhoneGap シナリオに関係しています。