web-dev-qa-db-ja.com

JavaScript:コールバック関数にパラメータを渡す

私はコールバックとして使用される関数にいくつかのパラメータを渡そうとしています、どうすればそれができますか?

function tryMe (param1, param2) {
    alert (param1 + " and " + param2);
}

function callbackTester (callback, param1, param2) {
    callback (param1, param2);
}

callbackTester (tryMe, "hello", "goodbye");
262
vitto

もう少し一般的なものが必要な場合は、arguments変数を次のように使用します。

function tryMe (param1, param2) {
    alert(param1 + " and " + param2);
}

function callbackTester (callback) {
    callback (arguments[1], arguments[2]);
}

callbackTester (tryMe, "hello", "goodbye");

それ以外の点では、あなたの例はうまくいきます(arguments [0]はテスターのコールバックの代わりに使うことができます)

233
Simon Scarfe

これも動作します:

// callback function
function tryMe (param1, param2) { 
    alert (param1 + " and " + param2); 
} 

// callback executer 
function callbackTester (callback) { 
    callback(); 
} 

// test function
callbackTester (function() {
    tryMe("hello", "goodbye"); 
}); 

他のシナリオ:

// callback function
function tryMe (param1, param2, param3) { 
    alert (param1 + " and " + param2 + " " + param3); 
} 

// callback executer 
function callbackTester (callback) { 
//this is the more obivous scenario as we use callback function
//only when we have some missing value
//get this data from ajax or compute
var extraParam = "this data was missing" ;

//call the callback when we have the data
    callback(extraParam); 
} 

// test function
callbackTester (function(k) {
    tryMe("hello", "goodbye", k); 
}); 
190

あなたの質問ははっきりしていません。より簡単な方法でこれを行うことができる方法を求めているならば、あなたはECMAScript第5版メソッド.bind()を見てみるべきです。 Function.prototype。それを使って、あなたはこのようなことをすることができます:

function tryMe (param1, param2) {
    alert (param1 + " and " + param2);
}

function callbackTester (callback) {
    callback();
}

callbackTester(tryMe.bind(null, "hello", "goodbye"));

現在のブラウザで利用できない場合はメソッドを追加する次のコードを使用することもできます。

// From Prototype.js
if (!Function.prototype.bind) { // check if native implementation available
  Function.prototype.bind = function(){ 
    var fn = this, args = Array.prototype.slice.call(arguments),
        object = args.shift(); 
    return function(){ 
      return fn.apply(object, 
        args.concat(Array.prototype.slice.call(arguments))); 
    }; 
  };
}

bind() - PrototypeJS文書

56
Andy E

特定の数のparamsを持つコード以外のものによって呼び出されるコールバックがあり、追加のparamsを渡したい場合は、コールバックとしてラッパー関数を渡し、ラッパー内で追加のparamを渡すことができます。

function login(accessedViaPopup) {
    //pass FB.login a call back function wrapper that will accept the
    //response param and then call my "real" callback with the additional param
    FB.login(function(response){
        fb_login_callback(response,accessedViaPopup);
    });
}

//handles respone from fb login call
function fb_login_callback(response, accessedViaPopup) {
    //do stuff
}
10
Blake Mills

パラメータがいくつあるかわからない場合は、コールバック関数に渡されます。 applyを使う.

function tryMe (param1, param2) {
  alert (param1 + " and " + param2);
}

function callbackTester(callback,params){
    callback.apply(this,params);
}

callbackTester(tryMe,['hello','goodbye']);
5
Zeeman Chen

「親」関数が呼び出されたときにそれらが評価されないようにするために、関数ラッパー内で引数として/引数として渡される「子」関数をラップします。

function outcome(){
    return false;
}

function process(callbackSuccess, callbackFailure){
    if ( outcome() )
        callbackSuccess();
    else
        callbackFailure();
}

process(function(){alert("OKAY");},function(){alert("OOPS");})
4
Alan McCune

任意の数のパラメータとコールバックコンテキストを持つ質問からのコード:

function SomeFunction(name) {
    this.name = name;
}
function tryMe(param1, param2) {
    console.log(this.name + ":  " + param1 + " and " + param2);
}
function tryMeMore(param1, param2, param3) {
    console.log(this.name + ": " + param1 + " and " + param2 + " and even " + param3);
}
function callbackTester(callback, callbackContext) {
    callback.apply(callbackContext, Array.prototype.splice.call(arguments, 2));
}
callbackTester(tryMe, new SomeFunction("context1"), "hello", "goodbye");
callbackTester(tryMeMore, new SomeFunction("context2"), "hello", "goodbye", "hasta la Vista");

// context1: hello and goodbye
// context2: hello and goodbye and even hasta la Vista
4

この簡単な例のようにカレー関数を使用してください。

const BTN = document.querySelector('button')
const RES = document.querySelector('p')

const changeText = newText => () => {
  RES.textContent = newText
}

BTN.addEventListener('click', changeText('Clicked!'))
<button>ClickMe</button>
<p>Not clicked<p>
2
user6748331

コールバックを使用した非常にわかりやすいNode.jsスタイルの例を示します。

/**
 * Function expects these arguments: 
 * 2 numbers and a callback function(err, result)
 */
var myTest = function(arg1, arg2, callback) {
  if (typeof arg1 !== "number") {
    return callback('Arg 1 is not a number!', null); // Args: 1)Error, 2)No result
  }
  if (typeof arg2 !== "number") {
    return callback('Arg 2 is not a number!', null); // Args: 1)Error, 2)No result
  }
  if (arg1 === arg2) {
    // Do somethign complex here..
    callback(null, 'Actions ended, arg1 was equal to arg2'); // Args: 1)No error, 2)Result
  } else if (arg1 > arg2) {
    // Do somethign complex here..
    callback(null, 'Actions ended, arg1 was > from arg2'); // Args: 1)No error, 2)Result
  } else {
    // Do somethign else complex here..
    callback(null, 'Actions ended, arg1 was < from arg2'); // Args: 1)No error, 2)Result
  }
};


/**
 * Call it this way: 
 * Third argument is an anonymous function with 2 args for error and result
 */
myTest(3, 6, function(err, result) {
  var resultElement = document.getElementById("my_result");
  if (err) {
    resultElement.innerHTML = 'Error! ' + err;
    resultElement.style.color = "red";
    //throw err; // if you want
  } else {
    resultElement.innerHTML = 'Result: ' + result;
    resultElement.style.color = "green";
  }
});

そして結果をレンダリングするHTML:

<div id="my_result">
  Result will come here!
</div>

あなたはここでそれをプレイすることができます: https://jsfiddle.net/q8gnvcts/ - 例えば数字の代わりに文字列を渡すようにしてください: myTest( 'some string'、6、function (err、result) ..そして結果を見てください。

この例は、コールバック関数の非常に基本的な概念を表しているので役立つことを願っています。

0
Vlado

あなた自身のコードではなく、他の何らかの関数によってコールバックが呼び出され、追加のパラメータを追加したいというシナリオのための新しいバージョンです。

たとえば、成功コールバックとエラーコールバックを持つネストされたコールがたくさんあるとしましょう。この例では角度付きの約束を使用しますが、コールバック付きのJavaScriptコードはすべて同じ目的で使用します。

someObject.doSomething(param1, function(result1) {
  console.log("Got result from doSomething: " + result1);
  result.doSomethingElse(param2, function(result2) {
    console.log("Got result from doSomethingElse: " + result2);
  }, function(error2) {
    console.log("Got error from doSomethingElse: " + error2);
  });
}, function(error1) {
  console.log("Got error from doSomething: " + error1);
});

エラーを記録するための関数を定義し、デバッグの目的でエラーの発生源を保持することで、コードを整理することができます。これが、コードをリファクタリングする方法です。

someObject.doSomething(param1, function (result1) {
  console.log("Got result from doSomething: " + result1);
  result.doSomethingElse(param2, function (result2) {
    console.log("Got result from doSomethingElse: " + result2);
  }, handleError.bind(null, "doSomethingElse"));
}, handleError.bind(null, "doSomething"));

/*
 * Log errors, capturing the error of a callback and prepending an id
 */
var handleError = function (id, error) {
  var id = id || "";
  console.log("Got error from " + id + ": " + error);
};

呼び出し元の関数は、コールバック関数のパラメータの後にエラーパラメータを追加します。

0
Juangui Jordán
function tryMe(param1, param2) {
  console.log(param1 + " and " + param2);
}

function tryMe2(param1) {
  console.log(param1);
}

function callbackTester(callback, ...params) {
  callback(...params);
}



callbackTester(tryMe, "hello", "goodbye");

callbackTester(tryMe2, "hello");

続きを読む スプレッド構文について

0
Dmitry Grinko

私は同じことを探していて解決策を見つけました。誰かがこれを試してみたいのであれば、ここでそれは簡単な例です。

var FA = function(data){
   console.log("IN A:"+data)
   FC(data,"LastName");
};
var FC = function(data,d2){
   console.log("IN C:"+data,d2)
};
var FB = function(data){
   console.log("IN B:"+data);
    FA(data)
};
FB('FirstName')

他の質問 もこちら に投稿

0
Code_Crash