如何让javascript回调函数先执行?

时间:2017-05-27 20:20:06

标签: javascript jquery

我有以下代码(我已经剥离和简化):

function myOrder() {
        setLocation(); // sets a value for global variable 'location'  
                       // using GET         

        $.post('http://111.111.111.111/order', {
                Item: Chair,
                Price: 50, 
                Location: location;
                                               })
}

问题是此函数在setLocation()回调函数完成之前执行post()代码。

我需要首先完成setLocation()函数,因此它可以为' location'分配一个全局变量,然后将其用作POST部分中的值。

有人知道是否可以这样做吗?

由于

编辑:澄清: setLocation()是一个GET请求,它通过GPS获取当前位置并将其存储在全局变量名称' location'。

所以我认为发生的是在回调函数完成其GET响应之前的myOrder()方法POSTS。

3 个答案:

答案 0 :(得分:2)

使用异步流程

{{1}}

答案 1 :(得分:1)

由于您没有提供setLocation的实现,我假设您使用$.get或类似的jQuery函数($.ajax$.getJSON,... )。

在这种情况下,不要使用$.get的回调函数,也不要将响应数据存储为全局变量,但返回 $.get(...)因为它是一个承诺:

function setLocation() {
    // Return the promise object returned by $.get, $.getJSON, $.ajax, ...
    //  instead of using the callback function, and don't store the result
    //  in a global variable
    return $.get("myurl").then(function (data) {
        // As you did not provide the code, this serves only as example. The 
        // way you extract the latitude and longitude from the response may be
        // different. Adapt as needed:
        data = JSON.parse(data);
        var lat = data.result[0].lat;
        var lng = data.result[0].lng;
        // Return value will be the promised value: adapt the format as needed,
        // This will become the location variable content in your other function 
        return { lat, lng }; 
    });
}
function myOrder() {
    // Use the `then` method on the jQuery promise, and return
    //   the result of the `then` method again, so you can chain
    //   on myOrder() as well...
    return setLocation().then(function (location) {
        // Return the `$.post` result:
        return $.post('http://111.111.111.111/order', {
            Item: Chair,
            Price: 50, 
            Location: location;
       });
    });
}

答案 2 :(得分:0)

如果setLocation函数是异步函数,则需要将其更改为在完成后接收回调函数。

function myOrder() {
   setLocation(function() {
      $.post('http://111.111.111.111/order', {
            Item: Chair,
            Price: 50, 
            Location: location
      });
   });
}

希望它有所帮助。