jQuery执行顺序

jQuery执行顺序,jquery,Jquery,我想知道为什么在我的示例#1中警报会以正确的顺序1、2触发,但在示例#2中,我添加了一个ajax调用,那么触发顺序会变成2、1。还有谁能建议我如何使用ajax调用来实现期望的1,2。。。我被难住了 示例#1 示例2 ajax默认为asyn,因此发送ajax请求,然后执行之后的代码 因此,在第二种情况下,您得到2,1,因为只有当ajax请求一个成功响应时,才会触发1 要获得所需的1,2执行,可以从成功处理程序中调用函数test2() 或者,只需同步ajax请求即可。发送ajax请求时,可以将asy

我想知道为什么在我的示例#1中警报会以正确的顺序1、2触发,但在示例#2中,我添加了一个ajax调用,那么触发顺序会变成2、1。还有谁能建议我如何使用ajax调用来实现期望的1,2。。。我被难住了

示例#1

示例2


ajax
默认为asyn,因此发送ajax请求,然后执行之后的代码
因此,在第二种情况下,您得到2,1
,因为只有当ajax请求一个
成功响应时,才会触发1

要获得所需的1,2执行,可以从成功处理程序中调用函数test2()
或者,只需同步ajax请求即可。发送ajax请求时,可以将
async设置为false
。但是不推荐

ajax
默认为asyn,因此发送ajax请求,然后执行之后的代码
因此,在第二种情况下,您得到2,1
,因为只有当ajax请求一个
成功响应时,才会触发1

要获得所需的1,2执行,可以从成功处理程序中调用函数test2()
或者,只需同步ajax请求即可。发送ajax请求时,可以将
async设置为false
。但是不推荐上传前
中的ajax创建了一个非阻塞后台工作程序,它显然要在上传文件后才能完成

如果您需要在上载之前先完成
,那么您必须通过添加
async=false来告诉
$.ajax
不要异步运行

function test() {
    data = { alc: 'private', bucket: 'PhotojimaDev', file: file.name, key: path };
    $.ajax({
        async: false,
        url: sf.getServiceRoot('photojima') + "Upload/getPolicy",
        type: 'POST',
        data: data,
        beforeSend: sf.setModuleHeaders
    }).done(function (response, status) {
        if (status == "success") {
            policy = response.policy;
            signature = response.signature;
            alert('1');
        }
    }).fail(function (xhr, result, status) {
        alert("Uh-oh, something broke: " + status);
    });
}

手动搜索异步:

上传前
中的ajax创建了一个非阻塞后台工作程序,它显然要在上传文件后才能完成

如果您需要在上载之前先完成
,那么您必须通过添加
async=false来告诉
$.ajax
不要异步运行

function test() {
    data = { alc: 'private', bucket: 'PhotojimaDev', file: file.name, key: path };
    $.ajax({
        async: false,
        url: sf.getServiceRoot('photojima') + "Upload/getPolicy",
        type: 'POST',
        data: data,
        beforeSend: sf.setModuleHeaders
    }).done(function (response, status) {
        if (status == "success") {
            policy = response.policy;
            signature = response.signature;
            alert('1');
        }
    }).fail(function (xhr, result, status) {
        alert("Uh-oh, something broke: " + status);
    });
}

在手动中搜索异步:

准确无误。第一个请求中的ajax创建了一个非阻塞的后台工作程序,它显然要在alert(2)之后才能完成@ParvSharma感谢您的洞察力。现在我的难题是uploader.bind('UploadFile')中执行的代码需要在uploader.bind('BeforeUpload')的ajax调用成功后执行('BeforeUpload')。我无法从uploader.bind中移动代码('UploadFile'…到ajax成功回调..我该如何控制此工作流?这是一个名为plupload的上传插件,阻止您只传输函数test2()为了ajax请求的成功?没错。第一个请求中的ajax创建了一个非阻塞的后台工作程序,它显然要等到alert(2)@ParvSharma之后才能完成,感谢您的洞察力。现在我的难题是,代码在uploader.bind中执行('UploadFile'…需要在uploader.bind('BeforeUpload'…的ajax调用成功后执行,'UploadFile'…我无法将代码从uploader.bind('UploadFile'…移动到ajax成功回调。。我如何控制此工作流?这是一个名为plupload的uploader插件,它阻止您仅传输函数test2()ajax请求是否成功?根据定义,ajax是异步的。这意味着它不会等待服务器响应后再继续执行警报2。您可以通过使其同步(不推荐)来解决此问题,为警报2添加延迟,或为警报2添加另一个AJAX调用。在大多数情况下,顺序是不可预测的。根据定义,AJAX是异步的。这意味着在继续使用警报2之前,它不会等待服务器响应。您可以通过使其同步来解决此问题(不推荐),为警报2添加延迟,或者为警报2添加另一个AJAX调用。在大多数情况下,顺序是不可预测的。
function test() {
    data = { alc: 'private', bucket: 'PhotojimaDev', file: file.name, key: path };
    $.ajax({
        async: false,
        url: sf.getServiceRoot('photojima') + "Upload/getPolicy",
        type: 'POST',
        data: data,
        beforeSend: sf.setModuleHeaders
    }).done(function (response, status) {
        if (status == "success") {
            policy = response.policy;
            signature = response.signature;
            alert('1');
        }
    }).fail(function (xhr, result, status) {
        alert("Uh-oh, something broke: " + status);
    });
}