Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
强制Javascript函数调用等待上一个函数调用完成_Javascript_Jquery - Fatal编程技术网

强制Javascript函数调用等待上一个函数调用完成

强制Javascript函数调用等待上一个函数调用完成,javascript,jquery,Javascript,Jquery,我有一个简单的Javascript函数: makeRequest(); 它做了大量工作,并将大量内容放入DOM中 我打了几个这样的电话: makeRequest('food'); makeRequest('shopping'); 然而,他们两人的射击速度如此之快,以至于他们互相踩着对方的脚。最终,我需要它具有的功能 makeRequest('food'); wait.... makeRequest('shopping'); only if makeRequest('food') has fi

我有一个简单的Javascript函数:

makeRequest();
它做了大量工作,并将大量内容放入DOM中

我打了几个这样的电话:

makeRequest('food');
makeRequest('shopping');
然而,他们两人的射击速度如此之快,以至于他们互相踩着对方的脚。最终,我需要它具有的功能

makeRequest('food');
wait....
makeRequest('shopping'); only if makeRequest('food') has finished
关于让这些一次只执行一个的想法


谢谢

如果这些函数实际执行AJAX请求,则最好保持它们异步。您可以发出同步AJAX请求,但这会阻止浏览器响应,并导致糟糕的用户体验

如果这些AJAX请求是一个接一个地发出的,因为它们相互依赖,那么您应该研究您的函数,看看它是否提供了回调机制

makeRequest('food', function()
{
    // called when food request is done
    makeRequest('shopping');
});
使用jQuery,它看起来是这样的

$.get("/food", function(food)
{
    // do something with food

    $.get("/shopping", function(shopping)
    {
        // do something with shopping
    });
});

我建议您只需异步编写它们——例如,调用makeRequest('shopping');来自第一个调用的AJAX完成处理程序


如果您不想异步编写代码,请参见

我想您有一个回调方法来处理请求的响应?一旦它这样做了,让它提出下一个请求

声明队列的数组和跟踪状态的标志:

var queue = [], requestRunning = false;
在makeRequest方法中:

if (requestRunning) {
   queue.push(requestParameter);
} else {
   requestRunning = true;
   // do the request
}
在回调方法中,在处理响应之后:

if (queue.length > 0) {
   var requestParameter = queue.splice(0,1)[0];
   // do the request
} else {
   requestRunning = false;
}

越来越近了。我尝试了您的第一个示例,但没有调用makeRequest with shopping。我可以发出警报,但它不会被触发,这意味着你做错了什么。你为什么不把你所做的事情贴出来呢?我可以利用回调来避免踩脚趾;谢谢他们一次只执行一个。这些函数中一定有异步执行的东西——也许是AJAX请求?是的,你是对的。有什么我能做的吗?很好,这就是我需要的。可与此处的方法结合使用: