需要在 Angularjs 应用程序中使用 promises ($q) 处理会话超时
need to handle session time out using promises ($q) in Angularjs application
我正在尝试将我现有的 jquery Ajax 请求转换为使用 Angularjs Promises。我不知道如何在我的承诺中包含失败条件。除了剩下的事情工作正常。
早些时候,我的 jquery Ajax 电话如下所示。在这里,当我在会话超时等情况下创建 Ajax 时,我使用了在 ajaxSissionTimeOutHandler().
中定义的获取警报消息
function getUserList() {
$.ajax({
async: false,
url: "oar3ajax.do",
type: "POST",
data: {
action: 'getUserDetails',
postMessage : parameterToSend,
lanes : filterCrtArg.subs
},
dataType: "json"
}).done(function(originalRequest) {
var res = originalRequest;
if (res == null) {
alert("Sorry...There was an error retrieving the Data.");
}
if (res.ResultSet.status == 'failure') {
alert(res.ResultSet.error);
} else {
/* Code to be Executed */
}
}).fail(function(jqXHR, textStatus) {
ajaxSissionTimeOutHandler();
});
}
function ajaxSissionTimeOutHandler() {
alert("You have been logged out due to inactivity");
window.location = "/";
}
以下是我使用 Promises 转换后的代码:
在services.js中:
this.getUserDetails = function() {
var originalRequest = $.ajax({
async: false,
url: "oar3ajax.do",
type: "POST",
data: {
action: "getUserDetails"
},
dataType: "json"
});
return $q.when(originalRequest).then(function(res) {
if (res.ResultSet.error) {
return $q.reject(res.ResultSet.error);
} else {
return res.ResultSet.Response;
}
});
并且在 controller.js 中:
var userPromise = DataService.getUserDetails();
userPromise.then(function(data) {
var indataToRefresh = data.tabDetails[0].columns;
}, function(error) {
alert(error);
});
在这里,当我在会话超时等情况下进行 Ajax 调用时,我希望获得类似于 ajaxSissionTimeOutHandler() 中定义的警报消息。我该如何定义它?
首先,不要用$.ajax
,用angular的$http
代替。然后它看起来像这样(未经测试,但你应该明白):
// earlier, include $http in your service function
// e.g. angular.module('yourModule'). service('yourService', function($http) {
// note that angular uses json by default
this.getUserDetails = function() {
return $http.post('oar3ajax.do', {action: "getUserDetails"}).success(function(response) {
// do something with your data
}).error(function(error) {
// do something with the error
});
});
您的控制器可以相同。 $http
已经 returns 一个承诺,所以你可以只使用 return $http.post
。如果你想处理你的数据,在你的控制器中解决承诺之前,你可以这样做:
// earlier, include $http and $q in your service function
// e.g. angular.module('yourModule'). service('yourService', function($http, $q) {
// note that angular uses json by default
this.getUserDetails = function() {
var deferred = $q.defer();
$http.post('oar3ajax.do', {action: "getUserDetails"}).success(function(response) {
// do something with your data
// then resolve
deferred.resolve(response);
}).error(function(error) {
// do something with the error
deferred.reject(response);
});
return deferred.promise;
});
我正在尝试将我现有的 jquery Ajax 请求转换为使用 Angularjs Promises。我不知道如何在我的承诺中包含失败条件。除了剩下的事情工作正常。
早些时候,我的 jquery Ajax 电话如下所示。在这里,当我在会话超时等情况下创建 Ajax 时,我使用了在 ajaxSissionTimeOutHandler().
中定义的获取警报消息function getUserList() {
$.ajax({
async: false,
url: "oar3ajax.do",
type: "POST",
data: {
action: 'getUserDetails',
postMessage : parameterToSend,
lanes : filterCrtArg.subs
},
dataType: "json"
}).done(function(originalRequest) {
var res = originalRequest;
if (res == null) {
alert("Sorry...There was an error retrieving the Data.");
}
if (res.ResultSet.status == 'failure') {
alert(res.ResultSet.error);
} else {
/* Code to be Executed */
}
}).fail(function(jqXHR, textStatus) {
ajaxSissionTimeOutHandler();
});
}
function ajaxSissionTimeOutHandler() {
alert("You have been logged out due to inactivity");
window.location = "/";
}
以下是我使用 Promises 转换后的代码:
在services.js中:
this.getUserDetails = function() {
var originalRequest = $.ajax({
async: false,
url: "oar3ajax.do",
type: "POST",
data: {
action: "getUserDetails"
},
dataType: "json"
});
return $q.when(originalRequest).then(function(res) {
if (res.ResultSet.error) {
return $q.reject(res.ResultSet.error);
} else {
return res.ResultSet.Response;
}
});
并且在 controller.js 中:
var userPromise = DataService.getUserDetails();
userPromise.then(function(data) {
var indataToRefresh = data.tabDetails[0].columns;
}, function(error) {
alert(error);
});
在这里,当我在会话超时等情况下进行 Ajax 调用时,我希望获得类似于 ajaxSissionTimeOutHandler() 中定义的警报消息。我该如何定义它?
首先,不要用$.ajax
,用angular的$http
代替。然后它看起来像这样(未经测试,但你应该明白):
// earlier, include $http in your service function
// e.g. angular.module('yourModule'). service('yourService', function($http) {
// note that angular uses json by default
this.getUserDetails = function() {
return $http.post('oar3ajax.do', {action: "getUserDetails"}).success(function(response) {
// do something with your data
}).error(function(error) {
// do something with the error
});
});
您的控制器可以相同。 $http
已经 returns 一个承诺,所以你可以只使用 return $http.post
。如果你想处理你的数据,在你的控制器中解决承诺之前,你可以这样做:
// earlier, include $http and $q in your service function
// e.g. angular.module('yourModule'). service('yourService', function($http, $q) {
// note that angular uses json by default
this.getUserDetails = function() {
var deferred = $q.defer();
$http.post('oar3ajax.do', {action: "getUserDetails"}).success(function(response) {
// do something with your data
// then resolve
deferred.resolve(response);
}).error(function(error) {
// do something with the error
deferred.reject(response);
});
return deferred.promise;
});