Ожидание асинхронного обратного вызова javascript @ http post - PullRequest
0 голосов
/ 04 августа 2009

Я реализую небольшую функцию и немного застрял.

У меня есть кнопка для выполнения какого-либо действия, например

<input type="submit" value="My Button" onclick="javascript:DoSomething();" />

Когда пользователь нажимает кнопку, вызывается функция DoSomething.

    function DoSomething()
    {
        var geocoder = new GClientGeocoder();
        geocoder.getLocations(map.getCenter(), function SetField(response)
          {
            if (!response || response.Status.code != 200) 
            {
               alert("Status Code:" + response.Status.code);
            } 
            else 
            {
                var place = response.Placemark[0];
                $('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode;
            }
          });
}

Внутри функции определена функция обратного вызова, которая выполняет асинхронную операцию, которая записывает название города в поле формы. Проблема в том, что асинхронный обратный вызов будет пытаться писать в поле после публикации страницы. Могу ли я заставить пост-процесс ждать результата обратного вызова? Обратный вызов определен в API Карт Google, и я не могу этого избежать.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 04 августа 2009

Сначала вы хотите изменить код обработчика onclick, добавив в него оператор возврата, например:

<input type="submit" value="My Button" onclick="javascript:return DoSomething();" />

Затем измените функцию DoSomething, чтобы она возвращала значение false, чтобы sumit был отменен, если он работает с асинхронным обратным вызовом. И измените асинхронный обратный вызов, чтобы отправить форму после завершения.

function DoSomething(doPost)
{
        var geocoder = new GClientGeocoder();
        geocoder.getLocations(map.getCenter(), function SetField(response)
          {
            if (!response || response.Status.code != 200) 
            {
               alert("Status Code:" + response.Status.code);
            } 
            else 
            {
                var place = response.Placemark[0];
                $('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode;

                // resubmit the form here 
                $('#yourFormID').submit();
            }
          });

         return false; // cancel the submitting of the form
}

Еще один подход заключается в том, чтобы включить в вашу форму обработчик onSubmit и использовать глобальный флаг, чтобы определить, разрешена ли отправка формы (т. Е. Если асинхронный режим отсутствует) обратный звонок еще в полете). Когда асинхронный обратный вызов вернется, вы очистите флаг и повторно отправите форму из javascript, как я продемонстрировал выше, вызывая метод submit () для элемента формы .

0 голосов
/ 04 августа 2009

Используйте обычную кнопку (type = "button") вместо кнопки отправки, чтобы форма не была опубликована. Вместо этого отправьте форму из функции обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...