Как заставить функцию ждать, пока другой завершит выполнение? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть форма, которая отправляется через плагин malsup ajaxForm, и я хочу, чтобы вызов ajax ожидал, пока плагин точной позиции листовки не найдет точную позицию, поэтому я могу добавить ее к данным, отправленнымформа, устанавливающая это в некоторых скрытых полях, которые я имею в своем html.Дело в том, что у меня нет четкого способа сделать это.

У меня есть следующее:

function InitMap()
{
map = L.map('map');

function onAccuratePositionError (e) {
    addStatus(e.message, 'error');
}

function onAccuratePositionProgress (e) {

}

function onAccuratePositionFound (e) {
    $('#latitud').val(e.latlng.lat);
    $('#longitud').val(e.latlng.lng);
    $('#presicion').val(e.accuracy);
}

map.on('accuratepositionprogress', onAccuratePositionProgress);
map.on('accuratepositionfound', onAccuratePositionFound);
map.on('accuratepositionerror', onAccuratePositionError);

}

И мой Ajax-вызов:

function InitJForm()
{
  $('form').ajaxForm({
        beforeSubmit:Geolocalizar,
        success: function(datos)
         { 
            window.location.href = 'some url...';
         },
        error: function(datos) 
        {
        var w = window.open('about:blank');
            w.document.open();
            w.document.write(datos.responseText);
            w.document.close();
    }
   });
}

Вызов геолокации:

function Geolocalizar()
{
map.findAccuratePosition({
    maxWait: 15000,
    desiredAccuracy: 20
});
return true;
}

Есть ли способ сделать вызов геолокации, чтобы дождаться, пока функция findaccurateposition завершит поиск местоположения перед отправкой истины и отправкой запроса?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Хорошо .. после большой работы и попытки Defferred object тоже безуспешно (не смог поймать, когда Api-функция "findAccuratePosition" закончила, потому что я думаю, что она завершается не сразу) ... Я решил удалить плагин MALSUP ajaxForm и сделатьпростой пользовательский $ .ajax.post.

Я запрещаю отправку по умолчанию и вызываю e.preventdefault.Я просто переместил пользовательский запрос ajax в найденное OnAccuratePosition, поэтому я уверен, что после того, как геолокация найдет координаты, сообщение ajax будет выполнено с информацией о местоположении.Также моя форма отправляла некоторые файлы (imgs), и мне пришлось наткнуться на объектное решение FormData для загрузки файлов через AJAX, которые я нашел только ЗДЕСЬ прекрасно объяснил:

http://hayageek.com/jquery-ajax-form-submit/

0 голосов
/ 05 февраля 2019

Ванильный вызов ajax имеет свойство async:true или async:false.Это вы могли бы использовать в своем текущем коде другими способами (вы определенно можете это выяснить)

Существует важный вопрос сообщества, который может вам помочь -

Что означает "асинхронность:false "do в jQuery.ajax ()?

Обновление : сейчас Как вы сказали, вам нужно дождаться завершения функции.Вы можете сделать это, передав функции обратного вызова в качестве аргументов.Сначала выполняются функции обратного вызова, и только затем выполняется функция, в которую они передаются в качестве параметра.Ниже приведено описание того, как вы можете использовать обратные вызовы в своей функции.

alert(Geolocalizar(function(){
                          map.findAccuratePosition({
                          maxWait: 15000,
                          desiredAccuracy: 20  });
                          return true;    
                             }
                  )
);

function Geolocalizar(callback)
    {
    // this code will be executed after callback function is executed
    // print or return anything;
    }
...