2010-05-21 3 views
4

Я хочу сделать асинхронные запросы на получение и получать разные результаты на основе ввода, который я предоставляю каждому. Вот мой код:Несколько запросов Ajax HTTP GET с различными входными переменными с использованием jQuery

param=1; 
$.get('http://localhost/my_page_1.php', param, function(data) { 
    alert("id = "+param); 
    $('.resul 5.t').html(data); 
}); 

param=2; 
$.get('http://localhost/my_page_2.php', param, function(data) { 
    alert("id = "+param); 
    $('.result').html(data); 
}); 

Результат для обоих запросов является: "ID = 2" Я хочу результаты быть: "ID = 1" для первой запрос, и «ID = 2 «для второго ...

Я хочу сделать это для многих запросов в одном файле HTML и интегрировать результаты в HTML-код , как только они будут готовы.

Может ли кто-нибудь помочь мне решить эту проблему?

ответ

4

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

Создайте уникальные имена для переменных, таких как param1, param2, а не просто переназначайте параметр.

Edit:

Заканчивать этот код:

for (var i = 0 ; i < 3; i++) { 
     param = i; 
     $.get('http://www.google.com',genCallback(param)); 
     param = i+5; 
    } 

    function genCallback(param) { 
     var cb = function (data) { 
      alert(param); 
     } 
     return cb; 
    } 

Честно говоря, я не совсем уверен, как это работает. Вы заметите, что он оповещает число 0, 1, 2 в некотором порядке, хотя я постоянно меняю параметры. Вместо того, чтобы создавать анонимную функцию в get напрямую, я создаю функцию, основанную на параметре. Я думаю, что происходит закрытие по cb, которое включает в себя локальный параметр genCallback в момент его выполнения.

+0

Да, это работает, спасибо .. Но я хочу сделать это с десятками запросов в цикле. Я пытаюсь сделать это в цикле, но это не сработает. И я хочу, чтобы все запросы были асинхронными, так как моя программа не зависала за каждое время отклика. Другие идеи? –

+0

Массив - хорошая идея, если вы знаете все просьбы, которые вы собираетесь сделать загодя. Я отредактировал свой ответ с более гибким решением. –

+0

Хорошее решение, я как бы злюсь на себя за то, что не понял себя и немного доволен, так как сегодня я смогу спать;) Читайте о том, как это работает [здесь] (http://en.wikipedia.org)/wiki/Closure_% 28computer_science% 29) –

1

Когда вы вызываете функцию AJAX, обратный вызов этого запроса обрабатывается без синхронизации с остальной частью вашего кода. Функция, указанная для вызова, когда запрос завершен, не вызывается до ... запрос завершен.

Это как ваш код наиболее часто (из-за асинхронной природы AJAX) будет работать:

  1. Вы установите param = 1 и отправить первый запрос Аякса
  2. Вы установите param = 2 и отправить запрос на второй АЯКС
  3. Первый звонок будет завершен. Обратный вызов для этого вызова обрабатывается. Ваша переменная param в настоящее время 2
  4. Второй вызов будет завершен. Обратный вызов для этого вызова обрабатывается. Ваша param переменная еще 2

решение будет иметь различные переменные для каждого вызова или для увеличения param и отправить второй вызов Ajax внутри функции обратного вызова первого.

+0

Спасибо, я понимаю, что происходит! Решение Fletcher Moore работает, но я хочу сделать все мои запросы в цикле, чтобы каждый из них был асинхронным, и для каждого из них был предоставлен другой вывод! Можно ли это реализовать? Решением, которое я могу себе представить, является предварительное вычисление всех этих значений и сохранение их в массиве, а затем создание цикла и создание каждого запроса с соответствующим элементом массива. Любые другие предложения? –