3

私は次のことで立ち往生しており、コールバックを扱った経験が不足しているためだと確信しています。次のようにデータベースにクエリを実行したいと思います。

db.transaction(queryFoodDBAll, errorCB);

function errorCB(tx, err) {
    alert("Error processing SQL: "+err);
}

function queryFoodDBAll(tx) {
    tx.executeSql('SELECT * FROM Food', [], displayAllFood, errorCB);
}

function displayAllFood(tx, results) {
    var len = results.rows.length;
    var items = new Array();
    for (var i=0; i<len; i++){
        items[i] = results.rows.item(i).data
    }
    printdata('settings-food',items, 'Food');
}

function printData(type,data,title) {
    switch(type)
    {
        case 'settings-food':
            alert("Data: "+data);
            var content = '<div data-role="collapsible" data-theme="c"><h3>'+title+'</h3>';
            for (var i=0;i<data.length;i++) {
                content += '<p>'+data[i]+'</p>';
            }
            content += '</div>';
            $("#settings-food").append(content);
            break;
}

これを実行すると、printData 関数を実行するまですべての情報が正常に取得されます。これにより、「Error processing SQL: undefined」と表示される errorCB が表示されます。

これに関するアイデアはありますか?

4

1 に答える 1

2

あなたの問題はリターンスタックです:

printData に到達すると、コール スタックは次のようになります。

----queryFoodDAll
----executeSQL
----disiplayAllFood (jump to printData)
----errorCB
----printData

Javascript はそのコール スタックを返します。したがって、下にスキップerrorCBしている間、上に戻る途中で、何をしてもその機能にヒットします。これはコールバック スタックの一部であるためです。

あなたがしたいことは、あなたerrorCBをコールバック関数として持たないことです。

代わりにdisplayAllFood()、有効な SQL をチェックインしてください。有効な場合は呼び出しリストを続けます (つまり、 に進みますprintData) 。有効でない場合は、 を呼び出しますerrorCB

于 2013-02-22T18:49:19.563 に答える