Wait for AJAX before continuing through separate function

前端 未结 2 1937
离开以前
离开以前 2021-02-05 21:47

Alright... at 2am, this is where I draw the line. Help... before my laptop ends up going out the window. :)

I\'ve tried using setTimer, callbacks, and everything else I

相关标签:
2条回答
  • 2021-02-05 22:24

    AJAX stands for asynchronous. That means that in your original code, saveRecord will be executed before the client will receive the response from the server (and, depending on the $.ajax implementation, it might be before the client will send the request to the server).

    Additionally, you seem to misunderstand how functions work in JS. var category = autoSelectCategory(payee); will set the category to the return value of autoSelectCategory; but the autoSelectCategory function in your code returns nothing.

    From the other side, the data return value of your anonymous function could only be used by $.ajax function (and $.ajax likely ignores the success parameter return value).

    Here is the code that should work:

    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
        });
    }
    
    0 讨论(0)
  • 2021-02-05 22:35

    Do not use async: false option. It's a pure evil (blocks all scripts in browser and even other tabs!) and it's deprecated since jQuery 1.8. You should use callbacks as it was always meant to be.

    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();
            }
        });
    }
    
    0 讨论(0)
提交回复
热议问题