Функция обратного вызова Javascript с параметрами
Этот вопрос выглядит как дубликат, поскольку название почти реплицируется. Но мой вопрос кажется более простым, и я не могу найти ответ на него.
У меня есть функция Javascript, которая выполняет другую функцию обратного вызова, она работает следующим образом:
<script type='text/javascript'>
firstfunction(callbackfunction);
</script>
где функция обратного вызова определяется как:
callbackfunction(response) {
if (response=='loggedin'){
// ... do stuff
}}
но я хочу, чтобы это было примерно так:
callbackfunction(response, param) {
if (response=='loggedin'){
// ... do stuff with param
}}
Мой вопрос: работает ли этот параметр таким образом:
<script type='text/javascript'>
firstfunction(callbackfunction(param));
</script>
или я делаю это неправильно?
Ответы
Ответ 1
В прямом ответе на ваш вопрос это не работает:
firstfunction(callbackfunction(param));
Это немедленно выполнит callbackfunction
и передаст возвращаемое значение из его выполнения в качестве аргумента firstfunction
, что маловероятно, что вы хотите.
Неясно, следует ли вам просто изменить firstfunction()
, чтобы передать два параметра в callbackfunction()
, когда он вызывает обратный вызов, или вы должны сделать анонимную функцию, которая вызывает функцию обратного вызова с аргументами.
Эти два варианта будут выглядеть так:
function firstfunction(callback) {
// code here
callback(arg1, arg2);
}
firstfunction(callbackfunction);
или
function firstfunction(callback) {
// code here
callback();
}
firstfunction(function() {
callbackfunction(xxx, yyy);
});
Ответ 2
Использовать анонимную функцию:
function foo( callback ) {
callback();
}
function baz( param ) {
console.log( param );
}
foo( function(){ baz('param') });
Ответ 3
Добавление параметров при вызове функции.
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply
xdaz уже ответил на простую версию.
Вот пример с переменным количеством параметров.
function someObject(){
this.callbacks=new Array();
this.addCallback=function(cb){
this.callbacks[this.callbacks.length]=cb
}
this.callCallbacks=function(){
//var arr=arguments; this does not seem to work
//arr[arr.length]="param2";
var arr = new Array();
for(i in arguments){
arr[i]=arguments[i];
}
arr[arr.length]="another param";
i=0;
for(i in this.callbacks){
this.callbacks[i].apply(null,arr);
//this.callbacks[i].apply(this,arr);
//this is a ref to currrent object
}
}
this.callCallbacksSimple=function(arg){
for(i in this.callbacks){
this.callbacks[i](arg,"simple parameter");
}
}
}
function callbackFunction(){
for(i in arguments){
console.log("Received argument: " + arguments[i]);
}
}
var ObjectInstance=new someObject();
ObjectInstance.addCallback(callbackFunction);
ObjectInstance.callCallbacks("call callbacks");
ObjectInstance.callCallbacksSimple("call callbacks");
Ответ 4
function
- ключевое слово, вы не можете использовать его как имя функции.
Скажем, ваше имя функции foo
, тогда вы можете сделать следующее:
var param = 'what ever';
foo(function(response) {
callbackfunction(response, param);
});
Ответ 5
Я думаю, что это то, что вы ищете.
Допустим, вы используете jQuery ajax, чтобы что-то сделать, и вы передаете ему обратные вызовы. Здесь у нас есть обратный вызов onError, который вы можете использовать для регистрации или обработки ошибок в вашем приложении. Он соответствует сигнатуре обратного вызова ошибки jQuery Ajax, за исключением дополнительного параметра, который вы, возможно, хотели бы добавить на задней панели
function onError(jqXHR, textStatus, errorThrown, yourOwnVariableThing) {
console.error('Something went wrong with ' + yourOwnVariableThing);
}
здесь будет вызываться ваша функция, но вам нужен дополнительный параметр
$.ajax("/api/getSomeData/")
.done(onDone)
.fail(onError)
.always(onComplete);
Вот что вы можете сделать, чтобы добавить дополнительный параметр
$.ajax("/api/getSomeData/")
.done(onDone)
.fail(onError.bind(this, arguments[0], arguments[1], arguments[2], 'Moo Moo');
.always(onComplete);
arguments
- это массив в JavaScript, содержащий все аргументы, переданные функции, и поэтому вы просто передаете эти аргументы вместе с обратным вызовом.
Arguments
Bind