2

我有一个看起来像这样的 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”在第一个完成后运行?推迟它似乎不太好。在 ajax 调用中将 async 设置为 false 是一个很好的解决方案吗?

编辑,像这样尝试并在我的成功中放置了一个 console.log。但是“全部完成”将首先运行:

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

3 回答 3

1

您可以只使用一个回调函数,以便它在第一个执行后立即执行:

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

或者,也许您可​​以重新考虑这个问题,并提出一个不需要两次调用相同函数的解决方案。也许你真的不需要这样做。

于 2012-12-13T13:31:23.057 回答
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);
});
于 2012-12-13T15:39:26.757 回答
0

如果您从函数中调用,您的示例将return正常$.ajax工作PersonAtLawUpdate

$.when需要对 ajax 调用的引用,因此请确保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
});
于 2012-12-13T15:39:40.350 回答