我可以改进这个AngularJS / AJAX javascript片段吗?

时间:2013-05-31 02:15:25

标签: javascript ajax design-patterns angularjs coding-style

我有以下一般代码。

MyClass.prototype.doSomething = function () {

    $.ajax({
        url: turl,
        dataType: 'jsonp',
        success: function (_this) { //closure
            return function (data) {
                _this._angular_scope.$apply(function () {

                    _this.property = // extract stuff from 'data'
                    _this.analyzeContent() // do more stuff with it
                })
            }
        }(this)
    })
}

基本上,这只是一个普通的AJAX调用。有一个......

(1)关闭“this”,以便成功函数可以访问我的对象及其状态

(2)在内部,我返回一个对数据执行某些操作的函数,但是......

(3)我希望AngularJS捕获成功所做的一切,因此解析数据的这个函数将进一步,将它的动作包装在$ apply调用中。

这有效,但我不禁想知道是否有更好的方法来实现这一目标。由于嵌套函数的数量,我每次看到它时都要考虑我正在做的事情,这是正确的。

这没关系,还是有更好的推荐风格?

1 个答案:

答案 0 :(得分:5)

我假设此代码块位于角度服务,控制器或指令内。如果不是,那么手头有更广泛的问题。 Angularjs附带一个$http服务,应该在这里代替$ .ajax。 $ http提供了与$ .ajax相同的功能,并增加了可测试的功能,并且它与angularjs摘要周期集成,因此您无需担心$ scope。$ apply()的内容。我会做类似以下的事情:

MyClass.prototype.doSomething = function () {
  var self = this;
  $http.get( turl ).success( function (data) {
    self.property = data.stuff;
    self.analyzeContent();
  } );
}

这里要记住的重要一点是javascript使用函数作用域,而不是块作用域。只要一个对象存在于同一个函数中,它就被认为是“在范围内”。由于this的值取决于上下文,因此您可以将其添加到变量(self)中,并确信该值是您期望的值。