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

部分関数を作成することでそれを行うことができます:

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

と:

getTransaction(iDontWork(value1, value2));
于 2012-06-12T14:30:17.963 に答える
0
getTransaction(function (x) {
    iDontWork(x, value1, value2);
});

あなたgetTransactionは、その単一の引数が 1 つのパラメーターを取る関数であると想定しています。1 つのパラメーターを受け取る新しい関数を作成する必要がありますが、必要な特定のパラメーター値 (つまりvalue1value2) も含まれます。


上記は無名関数を使用しています。名前付き関数を使用して行うこともできます。

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

getTransaction(forwarder);
于 2012-06-12T14:24:42.147 に答える