0

嘿,我正在使用 phonegap 数据库,并试图了解为什么在处理方法完成之前调用我的回调,下面是 js 代码和指示我的声明的日志

代码如下:(首先调用的方法是insertIntoDB(x,y);)

    var databaseVersion = 1;

function createTable(tx, tableName, tableColumns){
    var sqlStatement = 'CREATE TABLE IF NOT EXISTS '+tableName+' (_id unique, ' + tableColumns+')';
    tx.executeSql('DROP TABLE IF EXISTS '+tableName);
    tx.executeSql(sqlStatement);
    console.log('now doInsertion (if successful should be called');
}

function createMenuDataBase(tx){
    var tableName ="element";
    var tableColumns = ["name", "resource","remoteData", "picture", "pageId", "type", 
        "localAction", "replaceText", "textSize", "textColor","background", "sortOrder"];
    createTable(tx, tableName, tableColumns);
}



function insertIntoDB(tableName,json){
    checkDatabaseVersion(doInsertion,tableName,json);
}

function doInsertion(dbName,json){
    console.log('starting doInsertion');
    var sqlStart = "INSERT INTO "+dbName+" (";
    var sqlEnd =");"
    $.each(json.list, function(i, object) {
        var first = true;
        var columns="";
        var values = ") VALUES ("

        for (property in object) {
            //            alert(property);
            if(property!=undefined){

                if(first){
                    columns +=property;
                    values +=object[property];
                    first=false;
                } else {   
                    columns += ', '+property;
                    values +=', '+object[property];
                }
            }
        }
        console.log(sqlStart+columns+values+sqlEnd);
    });
}

function checkDatabaseVersion(callback,dbName,json){
    var localDatabaseVersion = localStorage.getItem("localDatabaseVersion");
    alert(localDatabaseVersion);
    if(localDatabaseVersion == 'undefined' || localDatabaseVersion == null){
        var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000);
        db.transaction(createMenuDataBase, errorCB, callback(dbName,json));


    //localStorage.setItem("localDatabaseVersion",databaseVersion);
    }
}

这是来自cordova/我的应用程序的logcat:

08-01 12:09:02.857: D/DroidGap(24433): onMessage(spinner,stop)
08-01 12:09:03.467: D/CordovaLog(24433): starting doInsertion
08-01 12:09:03.467: D/CordovaLog(24433): file:///android_asset/www/js/Database.js: Line 24 : starting doInsertion
08-01 12:09:03.472: D/CordovaLog(24433): INSERT INTO element (name, resource, id, type, appId, sortOrder, background, picture, textColor, remoteData, pageId, localAction, replaceText, active, textSize) VALUES (menu0.9747386311565038, null, 9765, img, 1, 0, null, /content/picture/menu/product, null, null, mainMenu.menu, showProductCatalog(product), null, Y, 0);
08-01 12:09:03.477: D/CordovaLog(24433): file:///android_asset/www/js/Database.js: Line 46 : INSERT INTO element (name, resource, id, type, appId, sortOrder, background, picture, textColor, remoteData, pageId, localAction, replaceText, active, textSize) VALUES (menu0.9747386311565038, null, 9765, img, 1, 0, null, /content/picture/menu/product, null, null, mainMenu.menu, showProductCatalog(product), null, Y, 0);
08-01 12:09:03.477: D/CordovaLog(24433): INSERT INTO element (name, resource, id, type, appId, sortOrder, background, picture, textColor, remoteData, pageId, localAction, replaceText, active, textSize) VALUES (menu0.9847155498013517, null, 9753, img, 1, 1, null, /content/picture/menu/social, null, null, mainMenu.menu, showSocialMedia(socialmedia), null, Y, 0);
08-01 12:09:03.477: D/CordovaLog(24433): file:///android_asset/www/js/Database.js: Line 46 : INSERT INTO element (name, resource, id, type, appId, sortOrder, background, picture, textColor, remoteData, pageId, localAction, replaceText, active, textSize) VALUES (menu0.9847155498013517, null, 9753, img, 1, 1, null, /content/picture/menu/social, null, null, mainMenu.menu, showSocialMedia(socialmedia), null, Y, 0);
08-01 12:09:03.482: D/CordovaLog(24433): INSERT INTO element (name, resource, id, type, appId, sortOrder, background, picture, textColor, remoteData, pageId, localAction, replaceText, active, textSize) VALUES (menu0.5451258043474583, null, 9759, img, 1, 2, null, /content/picture/menu/store, null, null, mainMenu.menu, menu(store), null, Y, 0);
08-01 12:09:03.482: D/CordovaLog(24433): file:///android_asset/www/js/Database.js: Line 46 : INSERT INTO element (name, resource, id, type, appId, sortOrder, background, picture, textColor, remoteData, pageId, localAction, replaceText, active, textSize) VALUES (menu0.5451258043474583, null, 9759, img, 1, 2, null, /content/picture/menu/store, null, null, mainMenu.menu, menu(store), null, Y, 0);
08-01 12:09:03.482: D/CordovaLog(24433): INSERT INTO element (name, resource, id, type, appId, sortOrder, background, picture, textColor, remoteData, pageId, localAction, replaceText, active, textSize) VALUES (menu0.6883956226802171, null, 9762, img, 1, 3, null, /content/picture/menu/showroom, null, null, mainMenu.menu, showCollection(collection), null, Y, 0);
08-01 12:09:03.482: D/CordovaLog(24433): file:///android_asset/www/js/Database.js: Line 46 : INSERT INTO element (name, resource, id, type, appId, sortOrder, background, picture, textColor, remoteData, pageId, localAction, replaceText, active, textSize) VALUES (menu0.6883956226802171, null, 9762, img, 1, 3, null, /content/picture/menu/showroom, null, null, mainMenu.menu, showCollection(collection), null, Y, 0);
08-01 12:09:03.487: D/CordovaLog(24433): INSERT INTO element (name, resource, id, type, appId, sortOrder, background, picture, textColor, remoteData, pageId, localAction, replaceText, active, textSize) VALUES (menu0.21612715546682493, null, 9768, img, 1, 4, null, /content/picture/menu/beskeder, null, null, mainMenu.menu, showNotificationList(notificationList), null, Y, 0);
08-01 12:09:03.487: D/CordovaLog(24433): file:///android_asset/www/js/Database.js: Line 46 : INSERT INTO element (name, resource, id, type, appId, sortOrder, background, picture, textColor, remoteData, pageId, localAction, replaceText, active, textSize) VALUES (menu0.21612715546682493, null, 9768, img, 1, 4, null, /content/picture/menu/beskeder, null, null, mainMenu.menu, showNotificationList(notificationList), null, Y, 0);
08-01 12:09:03.497: D/CordovaLog(24433): now doInsertion (if successful should be called
08-01 12:09:03.497: D/CordovaLog(24433): file:///android_asset/www/js/Database.js: Line 7 : now doInsertion (if successful should be called
4

1 回答 1

1

您正在调用回调而不是传递它:

db.transaction(createMenuDataBase, errorCB, callback(dbName,json));

callback(dbName,json) //Calls the function and passes the result to `db.transaction` as callback but it's not a function since the result is not a function.

试试这个:

db.transaction(createMenuDataBase, errorCB, callback);

或者如果callback需要这些参数,那么:

db.transaction(createMenuDataBase, errorCB, callback.bind( null, dbName, json ));
于 2012-08-01T10:51:32.877 回答