Могу ли я улучшить этот фрагмент кода AngularJS / AJAX?

У меня есть следующий общий код.

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 ответ

Решение

Я предполагаю, что этот блок кода находится внутри угловой службы, контроллера или директивы. Если это не так, то есть гораздо более широкий вопрос под рукой. 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) и быть уверенным, что значение соответствует ожидаемому.

Другие вопросы по тегам