2012-04-05 2 views
1

У меня есть форма, в которой абонент может выбрать новостные бюллетени, которые они хотят получить, а затем форма AJAX отправит результаты в Exact Target и добавит подписчика в каждый список, который хочет сделать абонент добавлено тоже.

У меня есть PHP foreach loop setup, чтобы справиться с этим.

<?php foreach ($listNumbers as $item): ?> 
      var xmlData = 'Ths is the ET API call'; 
      $.post('ET url for API call'+xmlData);  
     <?php endforeach; ?>  

После того, как цикл (ы) запускается, пользователь отправляется на страницу с благодарностью, подобную этой.

$(document).ready(function() { 
location.href = "thank you url"; 
}); 

Все работает .. по большей части. Я использую документ, потому что я хочу дать петле достаточно времени, чтобы отправить вызов API. Есть ли способ обнаружить, когда функции $ .post завершены? Если это успешно? а затем отправить пользователю, чтобы поблагодарить вас?

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

Спасибо, Майкл

+0

Использование PHP для цикла и создания jQuery $ .post .. почему? – Blake

+0

Должен быть лучший способ делать то, что вы делаете! – 472084

+0

Если скрипт подписки находится на вашем сайте, вы должны отправить ему массив флажков в один POST, чтобы уменьшить количество открытых подключений на вашем сервере. Если скрипты подписки находятся на других серверах, браузер блокирует сообщения из-за ограничений межсайтового скриптинга. –

ответ

2

http://api.jquery.com/jQuery.post/

Там в обратный вызов, который говорит вам, что он закончил

jQuery.post(url [, data] [, success(data, textStatus, jqXHR)] [, dataType]) 
  • URL - строка, содержащая URL, к которому направляется запрос.
  • данные - карта или строка, отправленная на сервер с запросом.
  • success (data, textStatus, jqXHR) - функция обратного вызова, которая выполняется, если запрос завершается успешно.
  • dataType - тип данных, ожидаемых от сервера. По умолчанию: Intelligent Guess (xml, json, script, text, html).

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

var xhrCount = <?= count($listNumbers) ?>; 
<?php foreach ($listNumbers as $item): ?> 
    var xmlData = 'Ths is the ET API call'; 
    $.post('ET url for API call'+xmlData, null, function() { 
     xhrCount--; 
     if (xhrCount === 0) { 
      location.href = 'myurl' 
     } 
    });  
<?php endforeach; ?> 

Не уверен, что может быть не так с вашим count(), но вы можете рассчитывать сами;

var xhrCount = 0; 
<?php foreach ($listNumbers as $item): ?> 
    var xmlData = 'Ths is the ET API call'; 
    xhrCount++; 
    $.post('ET url for API call'+xmlData, null, function() { 
     xhrCount--; 
     if (xhrCount === 0) { 
      location.href = 'myurl' 
     } 
    });  
<?php endforeach; ?> 
+0

Кажется, что код разбивается. Я добавил предупреждение для отслеживания циклов. var xhrCount =; var xmlData = 'Ths - вызов API-интерфейса ET; $ .post ('ET URL для API вызова' + XMLDATA, нуль, функция() { xhrCount--; если (xhrCount === 0) { location.href = 'myurl' } }); mkrisch

+0

'count()' должен работать, какая переменная '$ listNumbers', вы не можете использовать' ', Вам нужно вызвать echo,' 'Что я предложил в более простом синтаксисе, эквивалентном выражению echo. Убедитесь, что вы проверили, что 'count ($ listNumbers)' возвращает в изоляции –

+0

Кажется, что код разбивается. Я добавил предупреждение для отслеживания циклов после запуска цикла foreach. Я получаю первый результат. Затем он уходит. Он никогда не попадает на место href. Я также добавил еще место href в if (xhrCount === 0), чтобы узнать, делает ли код так далеко. Есть идеи? – mkrisch

1
$(document).ready(function() { }); // this is NOT the callback of the AJAX request 

выше не будет работать, так как она будет называться немедленно, потому что вы остаетесь на той же странице (которая уже готова). AJAX-вызовы асинхронны, поэтому он не будет ждать завершения запроса.

Вы можете либо выполнить асинхронный вызов, либо использовать обратный вызов успеха запроса ajax.

Чтобы лучше прояснить:

The $(document).ready(function() {}); пожаров, когда DOM готов (т.е. вроде как страница загружена, и я готов для других вещей (например, прикрепление слушателей событий)).То, что вы хотите сделать, это использовать дозвон .post() как:

$.post('ajax/test.html', function(data) { 
    // this only gets called when the ajax request is finished 
}); 

Но вопрос остается: почему вы используете PHP цикл для создания AJAX-запросов. Это просто не имеет никакого смысла. Вы все еще строите страницу с помощью PHP, так почему бы вам не добавить контент, который хотите получить с помощью AJAX?

+0

OP хочет вызвать 'location.href', который отменит XHR, если они не закончены –

+0

Да. Вот почему вызовы XHR должны быть либо асинхронными, либо 'location.href' должны быть в обратном вызове. Что случилось с тем, что я сказал выше? Либо я неправильно понимаю вас, либо вы не получаете меня. – PeeHaa

+0

Обратный вызов, о котором вы говорите, относится к тому, когда документ готов, а не когда закончится '$ .post'. –

0

Вы могли бы попробовать это var jqxhr = $.post('ET url for API call'+xmlData);

После цикла:

jqxhr.complete(function(){ 
    location.href = "thank you url"; 
}); 

Вы можете прочитать о функциях состояния jqXHR в documentation.

Но вы можете изменить весь свой подход. Возможно, ваш PHP должен вывести один массив javascript, который ваша страница могла бы зацикливаться. Что вы пытаетесь достичь?

+0

Я дам код abouve. Подходите для подтверждения ... и большое спасибо за помощь! – mkrisch

+0

@mkrisch Это не касается того факта, что существует несколько вызовов '$ .post', и вам нужно дождаться завершения их завершения. См. Мой ответ –

+0

Привет, Хуан. Я использую ваш код. У меня это работает ... в основном. Мне пришлось изменить var xhrCount = ; to var xhrCount = ; Выполняются циклы, результаты отображаются в Exact Target, но местоположение href не работает. Я получаю пустую страницу. Сейчас я устраняю неполадки. – mkrisch