我对AngularJs $ http promises中的 this 有疑问。
这是演示问题的代码。代码工作正常,但我会用它来解决有关对象的问题。 假设我有一个触发某种验证器的函数,它每5秒执行一次。你可以看到
$scope.startValidator = function () {
$log.log('This start: '+this);
DataService.validateUser(ConstService.getSessionId()).then(function (data) {
$log.log('This then: '+this);
$timeout(function () {
$log.log('This timeout: '+this);
$scope.startValidator();
}, 5000);
});
};
validateUser函数是这样的:
validateUser : function (sessionId) {
return $http({method: 'POST', url: 'proxyServlet', responseType : 'json', data : this.createAjaxParams('/user/validate', {}, {'x-session-id' : sessionId}, 'GET', '')});
}
在上面的代码中你可以看到$ log.log,它返回这个输出:
This start: [object Object] angular.js:9503
XHR finished loading: "http://localhost:8080/ArrowCalcit/proxyServlet". angular.js:8081
This then: undefined angular.js:9503
This timeout: undefined
我的第一个问题是:如何这个未定义?在第一个日志消息中,这是$ scope,但是未定义。 我的第二个问题是 - 我可以通过$ http(承诺)传递这个,所以我可以在promise回调中访问它吗? 在这种情况下,我可以轻松访问$ scope,但是假设我有一个服务,它有2个函数 - 一个有promise,在解决回调时应调用同一服务中的其他函数。
我怎么能做到这一点?这甚至可能吗?下面的 getBookmarks 功能与上面的 validateUser 格式相同。
angularApp
.service('FlowService', ['DataService', 'ConstService', function (DataService, ConstService) {
var flowService = {
getBookmarkData : function (bookmarkId) {
DataService.getBookmarkData(ConstService.getSessionId(), bookmarkId, this).then(
function (data) {
//..
}, function (XMLHttpRequest, textStatus, errorThrown) {
});
},
getBookmarks : function () {
DataService.getBookmarks(ConstService.getSessionId, this).then(
function (data) {
this.getBookmarkData(438); //this is undefiend
}, function (XMLHttpRequest, textStatus, errorThrown) {
});
}
};
return flowService;
}]);
在这种情况下,我也得到这个未定义。任何解决方案,对我的问题的建议?我会感谢任何帮助。
亲切的问候