2015-03-09 4 views
0

Я вызываю несколько вызовов ajax, но код достигает API только после выполнения всех вызовов ajax.AngularJS: множественные асинхронные вызовы AJAX

Javascript:

function test = function(){ 
     var entity = {}; 
     entity.Number = 1; 
     appFactory.testPostCall(entity, 'ApiController/TestMethod'); 

     entity.Number = 2; 
     appFactory.testPostCall(entity, 'ApiController/TestMethod'); 
    } 

AppFactory

factory.testPostCall = function (number, appendUrl) { 
     var q = $q.defer(); 

     $http({ 
      method: "POST", 
      url: url + appendUrl, 
      data: number 
     }).success(function (data, status, headers, config) { 
      q.resolve(data); 
     }).error(function (data, status, headers, config) { 
      q.reject(data); 
     }); 
     return q.promise; 
    } 

API

[HttpPost] 
     public Nullable<int> TestMethod(TestEntity entity) 
     { 
      return entity.Number; 
     } 

Я проследил, как код работает на контрольных точек. вызов функции тестирования() выполняет следующие действия:

javascript -> appFactory 
javascript -> appFactory 
API 
API 
//with the parameter Entity having the value Entity.Number = 2 for both API calls. 

Я попытался поместить контрольную точку в

entity.Number = 2; 

и ждать, пока API называется, но, кажется, что код ожидает функция не до конца, пока вызывается API. Я так растерялся от поведения этого, я действительно ожидал что-то вроде следующего:

javascript -> appFactory -> API //entity.Number = 1 

javascript -> appFactory -> API //entity.Number = 2 

Chaining работает хорошо, но мне нужно работать как самостоятельно, так и я действительно хочу, чтобы понять, Что происходит.

entity.Number = 1; 
      appFactory.testPostCall(entity, 'ApiController/TestMethod') 
.then(function(data){ 
      entity.Number = 2; 
      appFactory.testPostCall(entity, 'ApiController/TestMethod'); 
    }); 

спасибо !!!

ответ

1

Вы передаете entity своей функции в обеих догадках. Угадай, что? В JS, все объекты передаются по ссылке, а не копией. Подобные вопросы все более SO: Why isn't this object being passed by reference when assigning something else to it?

У вас есть две возможности иметь поведение, которое вы ожидаете:

  • Вы можете использовать замыкание, чтобы убедиться, что параметр передается как вы хотели бы
  • Вы можете мелко копировать ваш объект

Я бы лично пошел к третьему варианту, который заключается в том, что вы не слепо передаете объект в свой API.

+0

Эй, это один глаз для меня O_O спасибо! Еще одна проблема для меня: теперь API получает 1 и 2. Теперь единственная проблема заключается в том, что вызовы API вызываются только после выполнения всей функции. – ElementaryStudentProgramming

+0

@ElementaryStudentProgramming: Это цель «Обещания». Это неблокирование, async. –

+0

Я не совсем получить его, если это «без блокировки», не должен первый 'appFactory.testPostCall (юридическое лицо,«ApiController/TestMethod»);' выйти в API момент он называется? Вместо этого происходит то, что код ожидает выполнения всей функции javascript до того, как код достигнет API. – ElementaryStudentProgramming

Смежные вопросы