如何向WebSQL回调函数传递额外的参数?

5

我正在调用一个带有以下代码的函数db.transaction:

    db.transaction(createSheetDB, function(){alert("Sheet creation error!")}, function(){alert("Sheet created!")});

createSheetDB函数是一个回调函数,它被db.transaction()隐式调用,并将参数tx传递给它。我已经按照以下方式实现了createSheetDB函数:

function createSheetDB(tx) {
var nextId = getNextId();
tx.executeSql("INSERT INTO SHEET(id, name, desc) VALUES("+nextId+",'"+sheetName+"','"+desc+"')", [], 
        function(){alert("Sheet row inserted!")}, 
        function(tx, err){alert("Sheet row insertion Error: "+err.message+" "+err.code)}
);}

现在的问题是,sheetName和desc的值仅在调用函数中可用。我如何将它们传递到函数createSheetDB(tx)中?


1
对于通用情况,有许多关于问题和答案的内容(使用将绑定到局部变量的闭包,然后调用真正的回调函数或在相同词法范围内定义真正的回调函数等),因此希望这种“精细情况”更适用..但我不使用WebSQL。 - user166390
谢谢@pst,我目前正在使用这种方法来解决我的问题。 - Balkrishna Rawool
2个回答

3
你可以使用一种技术,创建一个新的回调函数来捕获你想要的变量。
function doStuff(callback) {
    var val = 43;
    callback(val);
}

function myCallback(val, anotherVal) {
    alert("val: " + val + "\nanotherVal: " + anotherVal);
}

(function() {

    var anotherVal = "Whoa!",
        anotherCallback = function(val) {
            return myCallback(val, anotherVal);
        };

    doStuff(anotherCallback);

}());​

谢谢@Josh,这个解决方案对我来说比shaac的更清晰。 - Balkrishna Rawool

1

将回调函数创建为一个函数

function createSheetDB(sheetName, desc) {
    return function(tx){
        var nextId = 1;
        alert("INSERT INTO SHEET(id, name, desc) VALUES("+nextId+",'"+sheetName+"','"+desc+"')");
        /* delete above two lines and uncomment for your code
        var nextId = getNextId();
        tx.executeSql("INSERT INTO SHEET(id, name, desc) VALUES("+nextId+",'"+sheetName+"','"+desc+"')", [], 
            function(){alert("Sheet row inserted!")}, 
            function(tx, err){alert("Sheet row insertion Error: "+err.message+" "+err.code)}
        );
        */
    }
}

// dummy code to show as example
db = {transaction: function(fn,lose,win){return fn(),win();}};

function testIt(){
    var sheetName = 'hello',
        desc = 'world';
    db.transaction(createSheetDB(sheetName, desc), function(){alert("Sheet creation error!")}, function(){alert("Sheet created!")});
    // note how createSheetDB is now called with the vars you want
}

谢谢@shhac。这个解决方案看起来不错。但对我来说,Josh的那个看起来更简洁。虽然可能只是我自己的感觉。;) - Balkrishna Rawool
这很公平。在一个大的代码块中,我会发现Josh的方式更难跟踪变量,这就是为什么我将它们全部放在一起作为一个函数的原因。 - Paul S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接