2013-10-14 4 views
1

Привет, я очень смущен этим аргументом: я знаю, что в javascript функция иногда возникает в асинхронном режиме , и вот моя проблема. У меня есть функция, называемаяфункция и отложенная jquery

function createPopupHour() 

Эта функция создает элемент выбора html и ничего не возвращает. Я вызываю эту функцию в запросе $ .AJAX в успешной части запроса.

$.ajax({ 
      url:"responseregistrodocente.php", 
      data:{ 
       operazione:'caricaAssenza', 
       idAssenza:id_array[3], 
       codiceFiscale: id_array[0], 
       data:id_array[1], 
       tipo:id_array[2] 
       }, 
      type:"POST", 
      dataType:"json", 
      success: function (jsonObject) { 
      createPopupHourSelect() 
      //other code 
      }); 

      }, 
      error: function(error){ 
       //XMLREQQUESTOBJECT 
       alert(error.responseText); 
       location.reload(); 
      }, 
      cache:false, 
      ifModified:false 
     }); 

проблема в том, что когда я вызываю функцию, другой код не учитывает, что моя функция завершается. Я знаю, что в jquery есть «отложенный объект», может быть, мне нужно, чтобы моя функция создавала отложенный объект и возвращала его в код. но как sintax :? или есть еще один более простой и сухой раствор ???

Правильно ли это?

function createPopupHour select(){ //staff to do 
return $.deferred();//it's in pending state 
} 

и $ .ajax

$.ajax({ 
       url:"responseregistrodocente.php", 
       data:{ 
        operazione:'caricaAssenza', 
        idAssenza:id_array[3], 
        codiceFiscale: id_array[0], 
        data:id_array[1], 
        tipo:id_array[2] 
        }, 
       type:"POST", 
       dataType:"json", 
       success: function (jsonObject) { 
       var defered=createPopupHourSelect() 
       defered.then(function{//other code]) 
         defered.resolve(); 
       }); 

       }, 
       error: function(error){ 
        //XMLREQQUESTOBJECT 
        alert(error.responseText); 
        location.reload(); 
       }, 
       cache:false, 
       ifModified:false 
      }); 
+0

Что вы подразумеваете под "другим кодом, не замечающим, что моя функция заканчивается"? – Johan

+0

Использование асинхронного кода не требуется для нормального потока программы, когда функция возвращает код после выполнения вызова. Если другой код не работает, возможно, это связано с тем, что ваш код разбился либо при вызове функции, либо внутри функции. Проверьте консоль ошибок на наличие сообщений об ошибках Javascript. – Guffa

+0

Я имею в виду, что код ДОЛЖЕН запускаться до того, как функция beacose я не могу, например, изменить стиль css кнопки, чем я создаю в функции, потому что, когда css изменен, кнопка не существует. –

ответ

1

Да, other code должен находиться в функции обратного вызова, который будет выполняться, когда всплывающее окно, что будет сделано, так же, как код всплывающего запуска выполняется при Аякса готово. Вы можете использовать примитивный обратный вызов или использовать более мощный шаблон promise.

Синтаксис jQuery Deferred objects является

function …() { 
    var def = $.Deferred(); 
    // start asynchronous task 
     // when the task is done (in the future), call 
     def.resolve(…); // optionally with results 
    // and right now do 
    return def.promise(); 
} 

С $.ajax действительно возвращается обещание, а также, вы можете использовать цепочки с помощью .then (при условии, createPopUpHourSelect в приведенном выше шаблоне):

$.ajax({ 
    url:"responseregistrodocente.php", 
    data:{…}, 
    type:"POST", 
    dataType:"json", 
    cache:false, 
    ifModified:false 
}) 
.fail(function(error){ 
    alert(error.responseText); 
    location.reload(); 
}) 
.then(createPopupHourSelect) // gets passed the parsed JSON 
.then(function(result) { // gets passed the resolve arguments from the popup 
    // other code 
}); 

Если вам нужен ответ ajax и в другом коде, и вы не хотите передавать его через функцию popup, используйте

.then(function(json) { 
    return createPopupHourSelect(…) 
    .then(function(popupResults) { 
     // other code 
    }); 
}) /* returns a promise that resolves with result of other code 
.then(…) */ 
Смежные вопросы