1

正如标题所说,我想知道是否可以获取传递函数的参数。经过数小时的搜索和查看类似问题后,我仍然没有接近,所以我将附上一个简单的例子,而不是我正在研究的内容 - 因为我开始怀疑这是不可能的。

预期的全局功能

function getTransaction(anyMethod)
{   
    db.transaction
    (
        function(transaction) 
        {
            anyMethod(transaction);         
        },

        function errorCB(err) {
            redirectToLoginWithError("Error processing SQL");
        },

        function successCB() {
            ;//alert("Success!");
        }

    );  
}

要调用的函数

function iWork(tx)
{
  tx.doSomething();
}

function iDontWork(tx, param1, param2)
{
  tx.doSomething(param1, param2);
}

实际通话

// Works fine
getTransaction(iWork);
// The problem
getTransaction(iDontWork, value1, value2);

getTransaction(iDontWork2, value1, value2, ..., valueX);

我尝试了几种不同的方法,但到目前为止都没有成功。最接近的(虽然不是非常)是

getTransaction(function(){iDontWork(value1, value2)}));

这确实通过 getTransaction 调用了正确的函数,但没有正确传递参数:Params (value1, value2) 被保留,但事务对象丢失/未定义。我可以看到为什么会发生这种情况,但我看不到任何解决方案。总而言之,我也同意 getTransaction 应该被废弃并以某种方式重新编写。关键是要获得一种可以很好扩展的灵活方法。

4

3 回答 3

1

只需重构getTransation以获取一个函数和一组参数。将transaction变量添加到参数数组并使用以下命令调用函数apply

function getTransaction(anyMethod, methodArgs) {
    var someFunction = anyMethod;
    // if no args provided, use an empty array
    methodArgs = methodArgs || [];

    db.transaction (
        function(transaction) {
            // transaction is always the first arg; prepend it to the arg list
            methodArgs.unshift(transaction);
            // call method with argument array
            anyMethod.apply(null, methodArgs);
        },

    // ...

    );
}

只需将其用于:

doTransaction(iDontWork, [param1, param2]);
doTransaction(iWork);

编辑

正如@rambo coder 指出的那样,您可以通过切片使用常规参数(而不是参数数组)arguments

function getTransaction(anyMethod) {
    var someFunction = anyMethod;

    db.transaction (
        function(transaction) { 
            var methodArgs = arguments.slice(1);
            methodArgs.unshift(transaction);
            anyMethod.apply(null, methodArgs);
        },

     ...

通过这种方式,您可以直接向 提供参数getTransaction,就像您在示例 ( doTransaction(iDontWork, param1, param2);) 中所做的那样,而不是将它们放入数组中。

于 2012-06-12T14:35:20.303 回答
0
getTransaction(function (x) {
    iDontWork(x, value1, value2);
});

getTransaction假设它的单个参数是一个带有一个参数的函数。您需要创建一个新函数,该函数接受一个参数,但还包括您想要的特定参数值(即value1value2)。


以上使用匿名函数;您也可以使用命名函数来做到这一点:

function forwarder(x) {
    iDontWork(x, value1, value2);
}

getTransaction(forwarder);
于 2012-06-12T14:24:42.147 回答
0

您可以通过创建部分函数来做到这一点:

function iDontWork(param1, param2){
    return function(tx) {
        tx.doSomething(param1, param2);
    }
}

和:

getTransaction(iDontWork(value1, value2));
于 2012-06-12T14:30:17.963 回答