2013-02-10 4 views
1

Мне интересно, почему в моем примере # 1 срабатывает предупреждение в правильном порядке 1, 2, но в примере # 2, где я добавляю вызов ajax, тогда порядок стрельбы становится 2,1. Также может кто-нибудь предложить, как с помощью вызова ajax я мог бы достичь желаемого порядка стрельбы 1, 2 ... Я в тупике.Порядок выполнения jQuery

Пример # 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'); 
    } 
}); 
+0

AJAX является по определению асинхронной. Это означает, что он не будет ждать ответа сервера, прежде чем продолжить предупреждение 2. Вы можете решить это, сделав его синхронным (не рекомендуется), добавив задержку для предупреждения 2 или добавив еще один вызов AJAX для предупреждения 2. В большинстве случаев порядок не предсказуем. – bldoron

ответ

1

Аякса в 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); 
    }); 
} 

Искать асинхронном в руководстве: http://api.jquery.com/jQuery.ajax/

0

ajax по умолчанию ASYN поэтому запрос Ajax будет отправлять и затем код после этого выполняется
, так как во втором случае вы получаете 2, 1
, потому что 1 будет выпущен только после запроса ajax a success response

, чтобы получить желаемое выполнение 1,2, вы можете вызвать функцию test2() из обработчика успеха
ИЛИ
просто выполните синхронизацию запроса ajax. это можно сделать, установив async to false при отправке запроса ajax. но не рекомендуется

+0

Точно. Ajax в первом запросе создает неблокирующий фоновый рабочий, который, очевидно, не заканчивается, пока после предупреждения (2) – Christian

+0

@ParvSharma Спасибо за понимание. Теперь моя головоломка превращается в то, что код, выполняемый в uploader.bind ('UploadFile' ... должен быть выполнен после успеха вызова ajax из uploader.bind ('BeforeUpload' ... Я не могу переместить код из загрузчика. bind ('UploadFile' ... к обратному вызову ajax. Как я могу контролировать этот рабочий процесс? –

+0

Что здесь загружается? –

Смежные вопросы