1

我想知道为什么在我的示例 #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');
    }
}); 
4

2 回答 2

1

ajax inBeforeUpload创建了一个非阻塞后台工作程序,显然直到之后才完成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/

于 2013-02-10T09:50:00.163 回答
0

ajax默认情况下是异步的,所以发送一个 ajax 请求,然后执行之后的代码,
所以在第二种情况下你得到 2 , 1
因为只有当 ajax 请求 a 时才会触发 1success response

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

于 2013-02-10T09:42:44.753 回答