AngularJS承诺这个未定义

时间:2014-02-19 07:15:12

标签: javascript angularjs http this promise

我对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;
}]);

在这种情况下,我也得到这个未定义。任何解决方案,对我的问题的建议?我会感谢任何帮助。

亲切的问候

0 个答案:

没有答案