2014-10-11 3 views
0

Я новичок в Java Script и не понимает, как создать синхронный вызов Ajax с помощью объекта $ HTTP, если кто-нибудь есть идеи, пожалуйста, руководство меня, как я могу сделать Ajax вызов $ HTTP sychronously

мой код следующим образом -

var AjaxModule = angular.module('AjaxModule',[]); 
AjaxModule.controller('AjaxController',function($scope,$http){ 
    var path ="http://localhost/services_ajax/"; 
    var serviceName = 'customers'; 
    var response = $http.get(path+serviceName); 
    response.success(function(data){ 
     $scope.list = data; 
    }); 
}); 
+1

Почему вы считаете, что вам нужен синхронно-jax-вызов? – Bergi

+2

Служба $ http возвращает обещание, поэтому я не думаю, что вы можете настроить его для синхронного вызова ... Однако я не могу думать одного случая, когда я хочу, чтобы мое приложение остановилось, пока я не получаю ответ с сервера. – Josep

+0

, потому что я установил строки DataTable, итерации $ scope.list в html все html генерируются правильно, но поиск DataTable не работает как вызов dataTable перед генерированием строк таблицы из-за асинхронного запроса ajax. – Niles

ответ

1

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

var app = angular.module ("myApp", []);

app.controller ("Ctrl", функция ($ сферы, $ д, $ таймаут) {

var task1 = $q.defer(); 
task1.promice.then(function(value){ 
     // write a code here for your task 1 success 
} ,function(value){ 
     // write a code here for your task 1 error 
}); 

var task2 = $q.defer(); 
task2.promice.then(function(value){ 
     // write a code here for your task 2 success 
} ,function(value){ 
    // write a code here for your task 2 error 
}); 

$q.all([task1.prpmice,task2.promice]) 
    .then(function(){ 
      // write a code which is executed when both the task are completed 
    } ,function(){ 
      // write a code which is executed when some of the task are rejected 
}); 

}

приведенные выше код поможет вам понять концепцию обещает угловой

2

Вы не можете сделать синхронный запрос, используя службу $ http. Он жестко закодирован как асинхронный в служебном коде. Вы можете, однако, сделать свой собственный синхронный сервис.

var myApp = angular.module('myApp', []); 

myApp.service('synchronousService', [function() { 
    var serviceMethod = function (url) { 
     var request; 
     if (window.XMLHttpRequest) { 
      request = new XMLHttpRequest(); 
     } else if (window.ActiveXObject) { 
      request = new ActiveXObject("Microsoft.XMLHTTP"); 
     } else { 
      throw new Error("Your browser don't support XMLHttpRequest"); 
     } 

     request.open('GET', url, false); 
     request.send(null); 

     if (request.status === 200) { 
      return request.responseText; 
     } 
    }; 
    return serviceMethod; 
}]); 

myApp.controller('AppCtrl', function ($scope, synchronousService) { 
    var url = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20%28%22AAPL%22%29&env=store://datatables.org/alltableswithkeys"; 
    alert(synchronousService(url)); 
}); 

Здесь работает jsfiddle: http://jsfiddle.net/zono/uL0e1j3e/18/

Просто чтобы сказать, что синхронный запрос является очень плохой идеей.

+2

Я не уверен, что эта служба будет работать правильно во всех браузерах. – Josep

+0

Это всего лишь пример. Я улучшу ответ. –

+0

Ответ отредактирован. –

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