簡體   English   中英

在繼續執行單獨的功能之前等待AJAX

[英]Wait for AJAX before continuing through separate function

好吧......凌晨2點,這是我划線的地方。 幫助......在我的筆記本電腦最終走出窗外之前。 :)

我已經嘗試過使用setTimer,回調以及我能想到的其他一切(當然還有其他一些Stackoverflow提示)。 我已經刪除了所有內容,所以我只留下基本代碼。

我要做的是調用parseRow()並在最后保存記錄之前,我需要獲取相關的類別(通過AJAX); 然而,它吹過它,所以類別總是“未定義”。

function parseRow(row){
    var rowArray     = row.trim().split(",");
    var date         = rowArray[0];
    var checknum     = rowArray[1];
    var payee        = rowArray[2];
    var memo         = rowArray[3];
    var amount       = rowArray[4];

    //ERROR: blows right past this one and sets the category variable BEFORE ajax returns
    var category = autoSelectCategory(payee);

    saveRecord(date, checkNum, payee, memo, category, payment, deposit);
}

function autoSelectCategory(payee) {
    var data;
    $.ajax({
        async: false,
        url: "autoselectcategory",
        dataType: "json",
        data: {
            string: payee
        },
        success: function (returnedData) {
            data = returnedData;
        }
    });
    return data;
}

AJAX代表異步 這意味着在原始代碼中, saveRecord將在客戶端從服務器接收響應之前執行(並且,根據$.ajax實現,它可能在客戶端將請求發送到服務器之前)。

此外,您似乎誤解了JS中函數的工作原理。 var category = autoSelectCategory(payee); 將類別設置為autoSelectCategory的返回值; 但代碼中的autoSelectCategory函數不返回任何內容。

另一方面,匿名函數的data返回值只能由$.ajax函數使用( $.ajax可能忽略success參數返回值)。

這是應該工作的代碼:

function parseRow(row){
    var rowArray     = row.trim().split(",");
    var date         = rowArray[0];
    var checknum     = rowArray[1];
    var payee        = rowArray[2];
    var memo         = rowArray[3];
    var amount       = rowArray[4];

    autoSelectCategory(payee, function (category) {    
        saveRecord(date, checkNum, payee, memo, category, payment, deposit);
    });
}

function autoSelectCategory(payee, callback) {
    $.ajax({
        async: false,
        url: "autoselectcategory",
        dataType: "json",
        data: {
            string: payee
        },
        success: callback
    });
}

不要使用async: false選項。 這是一個純粹的邪惡(阻止瀏覽器中的所有腳本甚至其他標簽!)並且自jQuery 1.8以來它已被棄用。 你應該使用回調,因為它一直是這樣的。

function parseRow(row) {
    /* the other code */
    autoSelectCategory(payee, function() {
        saveRecord(date, checkNum, payee, memo, category, payment, deposit);
    });
}

function autoSelectCategory(payee, callback) { // <---- note the additional arg
    $.ajax({
        url: "autoselectcategory",
        dataType: "json",
        data: {
            string: payee
        },
        success: function(res) {
            /* the other code */
            callback();
        }
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM