Javascript 添加.done函数时,jQuery AJAX调用在不使用命令的情况下启动

Javascript 添加.done函数时,jQuery AJAX调用在不使用命令的情况下启动,javascript,jquery,ajax,Javascript,Jquery,Ajax,我正在重写一系列jQueryAjax请求,并且在.done代码块方面遇到了问题。我试图发送一个AJAX请求,并在处理数据之前等待响应。作为指导,我一直在使用以下页面: 我还研究了无数的堆栈问题,试图解决我的问题,但没有找到任何有用的方法。作为参考,我看到的一些问题如下: 我注意到,当我创建类似于上述指南的代码块时,函数在页面加载时运行,而不是在代码中触发时运行。为了隔离故障,我创建了一个简单的示例,如下所示: <!DOCTYPE html> <html lang=&qu

我正在重写一系列jQueryAjax请求,并且在
.done
代码块方面遇到了问题。我试图发送一个AJAX请求,并在处理数据之前等待响应。作为指导,我一直在使用以下页面:

我还研究了无数的堆栈问题,试图解决我的问题,但没有找到任何有用的方法。作为参考,我看到的一些问题如下:


我注意到,当我创建类似于上述指南的代码块时,函数在页面加载时运行,而不是在代码中触发时运行。为了隔离故障,我创建了一个简单的示例,如下所示:

<!DOCTYPE html>
<html lang="en">

<body>
    <button type="button" onclick="getData()">Click me</button>
</body>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
//Commented out due comment below   
/*function getData() {
        console.log('enter getData');
        return $.ajax({url:'./testajax.html',type:"POST"});
    }
     
    getData().done(function(data){
        console.log('enter done');
        alert(data);
    });*/

    function getData() {
        console.log('enter getData');
        $.ajax({ url: './testajax.html', type: "POST" })
            .done(function (data) {
                console.log('enter done');
                alert(data);
            });
        alert('after');
    }
</script>

</html>

点击我
//评论了下面的评论
/*函数getData(){
log('enter getData');
返回$.ajax({url:'./testajax.html',键入:“POST”});
}
getData().done(函数(数据){
console.log('enterdone');
警报(数据);
});*/
函数getData(){
log('enter getData');
$.ajax({url:'./testajax.html',键入:“POST”})
.完成(功能(数据){
console.log('enterdone');
警报(数据);
});
警报(“之后”);
}
我希望加载示例页面时不会发生任何事情,因为除非单击按钮,否则不会触发执行
getData()
函数。但是,当我加载页面时,我的控制台会记录“enter getData”,然后记录“enter done”,然后我会收到一个带有
/testajax.html
页面内容的警报(只有一个字符串)。此外,当我单击按钮时,它会进入
getData()
,但不会触发
getData().done
函数,因此不会收到警报

有没有人能在这里引导我正确的方向,帮助我阻止
getData()
函数在页面加载时执行,而是让按钮单击执行AJAX请求,等待结果,然后在
.done
块中执行代码?

getData()
您拥有的表达式立即调用pageload上的函数。然后将
.done
处理程序附加到它

听起来您需要一个调用
$.ajax
并向其附加
.done
的函数,如:

function getData() {
    console.log('enter getData');
    $.ajax({ url: './testajax.html', type: "POST" })
        .done(function (data) {
            console.log('enter done');
            alert(data);
        });
}
然后将
getData
作为事件处理程序附加到某处


。使用
.addEventListener
或jQuery的
.on('click'
)。

谢谢@certainperformance,它解决了页面加载时代码执行的问题,但执行的时间仍然不确定。我已更新了问题,以包括
警报('after');
,该警报当前在
警报(数据)之前触发
行。有没有办法让它等到AJAX请求完成后再继续执行代码?我可以将所有内容嵌套在连续的
函数中。完成了
但我正在寻找一种更干净的方法。你需要接受JS的异步特性-不要害怕使用它。不,没有好的方法阻止进一步执行一种方法是使用函数:
getData()。然后(processData)
其中
processData
是完全同步的