1

私の例 #1 ではアラートが適切な順序 1、2 で起動するのに、なぜ ajax 呼び出しを追加する例 #2 では起動順序が 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 はBeforeUpload、明らかに後まで終了しないノンブロッキング バックグラウンド ワーカーを作成します。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);
    });
}

マニュアルで async を検索してください: http://api.jquery.com/jQuery.ajax/

于 2013-02-10T09:50:00.163 に答える
0

ajaxはデフォルトで asyn であるため、ajax リクエストが送信され、その後のコードが実行され
ます。2 番目のケースでは 2 , 1 を取得します。
なぜなら、1 は ajax リクエストが asuccess response

目的の 1,2 実行を取得するには、成功ハンドラー内から関数 test2() を呼び出す

、ajax 要求を同期させるだけです。async to falseこれは、ajax リクエストを送信するときに設定できます。しかし、推奨されていません

于 2013-02-10T09:42:44.753 に答える