Последовательные Ajax звонки - PullRequest
10 голосов
/ 22 февраля 2011

Мне нужна небольшая помощь в разработке моего приложения.Используя Ajax, я хочу получить некоторые ресурсы PHP последовательно, но я не думаю, что будет полезно получить их, используя метод JQuery $.ajax.

Я думаю, что-то подобное означает неправильный дизайн:

$.ajax({
     url: SERVERURL+'index.php/home/checkAvailability',
     datatype: 'text',
     success: function(data){
        if(data == 'unavailable'){
           // do stuff
        }
        else{
           $.ajax({
              url: SERVERURL+'index.php/home/getWebTree/',
              dataType: 'json',
              success: function(data){
                 // do stuff
              }
           });
        }
     }
  });

Кто-нибудь может дать мне предложение улучшить дизайн?Как я могу сделать то же самое лучше?

Спасибо!

РЕДАКТИРОВАТЬ: как говорит нам @arnorhs, использование параметра async может быть решением.Но я все еще думаю, что есть другие решения вместо использования последовательных вызовов AJAX.

EDIT2: checkAvailability и getWebTree - это функции PHP, использующие CodeIgniter, который я разработал для получения ресурсов от внешнего сервера.используя Http_Request объект.

function checkAvailability() {
      $this->load->library('pearloader');
      $http_request = $this->pearloader->load('HTTP', 'Request');
      $http_request->setURL('http://myurl');
      $http_request->_timeout = 5;
      $http_request->sendRequest();
      $res = 'available';
      if (!$http_request->getResponseCode())
         $res = 'unavailable';
      return $res;
   }

Ответы [ 4 ]

12 голосов
/ 22 февраля 2011

Все звонки одновременно

Если вы хотите выполнять все вызовы ajax одновременно, вы можете просто вызвать запрос ajax сразу после остальных. Вы даже можете назначить им один и тот же обработчик успеха. Если вы хотите более «элегантный» подход, я бы сделал что-то вроде этого:

// define a set of requests to perform - you could also provide each one
// with their own event handlers..
var requests = [
    { url: 'http://someurl', data: yourParams   },
    { url: 'http://someurl', data: yourParams   },
    { url: 'http://someurl', data: yourParams   },
    { url: 'http://someurl', data: yourParams   }
];

var successHandler = function (data) {
    // do something
}

// these will basically all execute at the same time:
for (var i = 0, l = requests.length; i < l; i++) {
    $.ajax({
        url: requests[i].url,
        data: requests[i].data,
        dataType: 'text',
        success: successHandler
    });
}

.

сделать один запрос

Я не знаю ваш вариант использования, но, конечно, вы действительно должны пытаться получить все данные, которые вы извлекаете, в одном запросе. Это не будет напрягать ваш сервер, сайт / приложение будет казаться пользователю более быстрым и это лучший долгосрочный подход.

Я бы попытался объединить checkAvailability и getWebTree в один запрос. Вместо того чтобы получать данные в Javascript в виде текстовых объектов, лучшим подходом было бы получать их в виде данных JSON. К счастью, PHP предоставляет очень простые функции для преобразования объектов и массивов в json, поэтому вы сможете довольно легко работать с этими объектами.

edit : небольшие изменения в коде PHP теперь, когда я лучше понимаю ваш вариант использования.

Так что-то вроде этого в коде PHP / CI:

function getRequestData () {
    if (checkAvailability() == 'available') {
        $retval = array (
            'available' => '1',
            'getWebTree' => getWebTree()
        );
    } else {
        $retval = array (
            'available' => '0'
        );
    }   
    header('Content-type: text/javascript; charset=UTF-8');     
    echo json_encode($retval););
}

И код Javascript может затем обращаться к ним с помощью одного запроса Ajax:

$.ajax({
    url: 'http://yoururl/getRequestData',
    dataType: 'json',
    success: function (jsonData) {
        // we can now access the parameters like this:
        if (jsonData.checkAvailability) {
            // etc
        }
        //and of course do something with the web tree:
        json.getWebTree
    }
});

.

Выполнять запросы синхронно

Если вы установите для параметра async в параметрах $ .ajax значение false, то функции будут выполняться синхронно, поэтому ваш код останавливается до завершения выполнения ... или, как сказано в документации:

asyncBoolean

По умолчанию: true

По умолчанию все запросы отправляются асинхронно (т.е. по умолчанию установлено значение true). Если вам нужны синхронные запросы, установите для этого параметра значение false. Междоменные запросы и dataType: запросы «jsonp» не поддерживают синхронную работу. Обратите внимание, что синхронные запросы могут временно блокировать браузер, отключая любые действия, когда запрос активен.

См. http://api.jquery.com/jQuery.ajax/

10 голосов
/ 27 февраля 2011

Если вам действительно нужно сделать два звонка, вы можете быть более выразительными с Deffered , который был представлен в jQuery 1.5.

$.when(checkAvailability())
   .then(getWebTree())
   .fail(function(message){
       if(message === 'Not available!')
       {
           // do stuff
       }
   });

function checkAvailability(){
    var dfd = $.Deferred();

    $.ajax({
    url: SERVERURL+'index.php/home/checkAvailability',
    datatype: 'text',
    success: function(data){              
        if(data == 'unavailable'){
            dfd.reject("Not available!");
        }
        else{
           dfd.resolve();
        }
    }
    });

    return dfd.promise();
};

function getWebTree(){
    $.ajax({
        url: SERVERURL+'index.php/home/getWebTree/',
        dataType: 'json',
        success: function(data){
            // Do stuff
        }
    });
};

Проверьте это в прямом эфире на http://jsfiddle.net/jimmysv/VDVfJ/

3 голосов
/ 22 февраля 2011

Похоже, вы можете использовать отложенный объект, который является новым для jquery 1.5

http://api.jquery.com/category/deferred-object/

0 голосов
/ 22 февраля 2011

Программирование с помощью команд, которые должны обрабатываться в очереди в прямом эфире из обратных вызовов, и это именно то, что вы делаете.

Вы определяете обратный вызов при успешном выполнении вашего запроса и отправляете другой запрос, как только он будет выполнен.срабатывает и проверяется.

В этом нет ничего плохого.

Единственное, что делает его более удобным для сопровождения, это определение обратных вызовов как функций перед вызовом и просто присвоение $ .ajax именам функций

function myFunc() {
    //Do stuff
}

$.ajax{ {
    success: myFunc
} );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...