2012-12-13 5 views
2

я получил функцию Ajax, которая выглядит, как этотAjax функция оленья кожа завершена до второй работает

function PersonAtlLawUpdate(personRef) { 
var selectionPanel = $('div#SelectionPanel'); 
var fromdate = selectionPanel.find('input#FromDateTextBox')[0].defaultValue; 
var timeSpan = selectionPanel.find('select#TimeSpanDropdownList').data('timespanvalue'); 
var url = "MonthOverview.aspx/OnePersonAtlLawUpdate"; 
$.ajax({ 
    url: url, 
    data: JSON.stringify({ personRef: personRef, fromdate: fromdate, timespan: timeSpan }), 
    type: "POST", 
    contentType: "application/json", 
    dataType: "JSON", 
    context: document.body, 
    success: function (atlError) { 
     changePersonAtlStatusIcon(atlError, personRef); 
    }, 
    error: function (xhr, status, errorThrown) { 
     //alert(errorThrown + '\n' + status + '\n' + xhr.statusText); 
    } 
}); 

}

В одной функции мне нужно запустить это в два раза, как это:

PersonAtlLawUpdate($(gMarkedCell).parent("tr").attr("personref")); 
    PersonAtlLawUpdate(pRef); 

Проблема, которая может быть в том, что в некоторых случаях не работает на 100%. Функция dom не обновляется в одной из функций. И я думаю, что это потому, что другой «перезаписывает» его.

Итак, как я могу убедиться, что второй «PersonAtlLawUpdate» запускается после первого завершения? Нехорошо, что положил на это задержку. И это хорошее решение для установки async на false в вызове ajax?

EDIT, tride like this и поместил console.log в мой успех. Но «все в комплекте» будет работать первый из них:

$.when(PersonAtlLawUpdate($(gMarkedCell).parent("tr").attr("personref")), PersonAtlLawUpdate(pRef)).then(function(){console.log("all complete")}); 

ответ

1

Вы можете просто использовать функцию обратного вызова, так что он выполняет сразу после первого один выполнил:

PersonAtlLawUpdate($(gMarkedCell).parent("tr").attr("personref"), function(){ 
    PersonAtlLawUpdate(pRef); 
}); 

Или может быть, вы можете переосмыслить проблемы, и придумать решение, которое не требует вызова одной и той же функции дважды. Возможно, вам действительно не нужно это делать.

+0

Второй Безразлично» t запустить. Не имеет значения, если я создаю console.log. Разве он не считается другим параметром, когда я помещаю функцию в свой PersonAtlLawUpdate? Хорошая мысль переосмыслить проблему, вызвав одну и ту же функцию дважды. Возможно, это изменится позже, когда у меня будет больше времени. – thatsIT

+0

То же самое, что и отправить второй параметр «personRef» в качестве параметра, а в моей функции ajax запустить его следующим образом: function PersonAtlLawUpdate (personRef, cbFunc) {..... В случае успеха: if (cbFunc! = Null) { PersonAtlLawUpdate (cbFunc, undefined); }? – thatsIT

0

Я думаю, что то, что предлагает @Kyokasuigetsu, вам нужно изменить метод PersonAtlLawUpdate, чтобы он принял необязательный второй параметр: функцию обратного вызова, которая должна быть вызвана в обратном вызове.

function PersonAtlLawUpdate(personRef, cbFunc) { 
var selectionPanel = $('div#SelectionPanel'); 
var fromdate = selectionPanel.find('input#FromDateTextBox')[0].defaultValue; 
var timeSpan = selectionPanel.find('select#TimeSpanDropdownList').data('timespanvalue'); 
var url = "MonthOverview.aspx/OnePersonAtlLawUpdate"; 
$.ajax({ 
    url: url, 
    data: JSON.stringify({ personRef: personRef, fromdate: fromdate, timespan: timeSpan }), 
    type: "POST", 
    contentType: "application/json", 
    dataType: "JSON", 
    context: document.body, 
    success: function (atlError) { 
     changePersonAtlStatusIcon(atlError, personRef); 
     if (cbFunc != null) 
      cbFunc(); 
    }, 
    error: function (xhr, status, errorThrown) { 
     //alert(errorThrown + '\n' + status + '\n' + xhr.statusText); 
    } 
}); 

И чем сделать звонок как;

PersonAtlLawUpdate($(gMarkedCell).parent("tr").attr("personref"), function(){ 
    PersonAtlLawUpdate(pRef); 
}); 
0

Ваш пример будет работать нормально, если вы return ваши $.ajax звонки с вашего PersonAtLawUpdate функции.

$.when необходима ссылка на Аякса вызовов, поэтому убедитесь, что вы вернете Deferred (на основе AJAX вызова) из ваших функций

function PersonAtlLawUpdate(personRef) { 
    var selectionPanel = $('div#SelectionPanel'); 
    var fromdate = selectionPanel.find('input#FromDateTextBox')[0].defaultValue; 
    var timeSpan = selectionPanel.find('select#TimeSpanDropdownList').data('timespanvalue'); 
    var url = "MonthOverview.aspx/OnePersonAtlLawUpdate"; 
    //SEE THE NEXT LINE 
    return $.ajax({ 
     url: url, 
     data: JSON.stringify({ personRef: personRef, fromdate: fromdate, timespan: timeSpan }), 
     type: "POST", 
     contentType: "application/json", 
     dataType: "JSON", 
     context: document.body, 
     success: function (atlError) { 
      changePersonAtlStatusIcon(atlError, personRef); 
     }, 
     error: function (xhr, status, errorThrown) { 
      //alert(errorThrown + '\n' + status + '\n' + xhr.statusText); 
     } 
    }); 
} 

Использование:

$.when(PersonAtLawUpdate(ref1), PersonAtLawUpdate(ref2)).done(function(xhrRef1, xhrRef2) { 
    //do stuff w/ results from both calls 
    //if you return something from the server, 
    //the results will be available in xhrRef1[0] 
    //and xhrRef2[0], respectively (order they 
    //appear in the when(), not in the order they execute 
}); 
Смежные вопросы