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 函数,这给了我 errorCB 显示“错误处理 SQL:未定义”。

对此有什么想法吗?

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 回答