11

よし... 午前 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;
}
4

2 に答える 2

16

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
    });
}
于 2012-07-02T08:11:46.827 に答える
12

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();
        }
    });
}
于 2012-07-02T08:14:22.253 に答える