如何使函数等待另一个完成执行?

时间:2019-02-05 20:35:53

标签: jquery leaflet ajaxform

我有一个表单,该表单是通过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 :(得分:1)

好吧..经过大量工作并尝试了没有成功的Defferred对象,(Api函数“ findAccuratePosition”完成时无法捕获,因为我认为它已经完成了)...我决定删除MALSUP ajaxForm插件并制作一个简单的自定义$ .ajax。帖子。

我阻止默认的提交,并调用e.preventdefault。 我只是将自定义ajax请求移至找到的OnAccuratePosition,所以我保证在地理位置找到坐标之后,将使用位置信息执行ajax发布。 另外,我的表单正在提交一些文件(imgs),并且不得不遇到FormData对象解决方案,以便通过AJAX上传文件,直到我才发现在这里进行了精美的解释:

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

答案 1 :(得分:0)

香草ajax调用具有属性async:trueasync:false。您可以通过其他方式在当前代码中利用这一点(您绝对可以弄清楚)

有一个相关的社区问题可以帮助您-

What does "async: false" do in 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;
    }