jQuery执行顺序

时间:2013-02-10 09:40:31

标签: jquery

我想知道为什么在我的示例#1中警报以正确的顺序触发1,2,但是在示例#2中我添加了ajax调用,然后触发顺序变为2,1。也有人可以建议如何使用ajax调用我可以达到1,2的所需点火顺序......我很难过。

示例#1

uploader.bind('BeforeUpload', function (up, file, policy, sinature) {
    //alert('1');

    test();
    function test() {
        alert('1');
    }
});

uploader.bind('UploadFile', function (up, file, policy, signature) {
    test2();
    function test2() {
        alert('2');
    }
});

示例#2

uploader.bind('BeforeUpload', function (up, file, policy, sinature) {
    //alert('1');

    test();
    function test() {
        data = { alc: 'private', bucket: 'PhotojimaDev', file: file.name, key: path };
        $.ajax({
            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);
        });
    }
});

uploader.bind('UploadFile', function (up, file, policy, signature) {
    test2();
    function test2() {
        alert('2');
    }
}); 

2 个答案:

答案 0 :(得分:1)

BeforeUpload中的ajax创建了一个非阻塞的后台工作程序,显然在UploadFile之后才会完成

如果您需要BeforeUpload先完成,那么您必须通过添加$.ajax

告诉async = false不能异步运行
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);
    });
}

在手动中搜索异步:http://api.jquery.com/jQuery.ajax/

答案 1 :(得分:0)

ajax默认为asyn,因此发送ajax请求,然后执行之后的代码 所以在第二种情况下你得到2,1,因为只有在ajax请求success response

时才会触发1

要获得所需的1,2执行,您可以从成功处理程序中调用函数test2() 或者只是让ajax请求同步。这可以在发送ajax请求时设置async to false。但不建议