2016-11-25 4 views
25

У меня есть функция callWithMagic, которая принимает функцию обратного вызова в качестве параметра и вызывает ее одним аргументом.Передайте дополнительный аргумент функции обратного вызова

const callWithMagic = callback => { 
    const magic = getMagic(); 
    callback(magic); 
}; 

У меня также есть функция processMagic, которая принимает два аргумента: magic и theAnswer.

const processMagic = (magic, theAnswer) => { 
    someOtherMagic(); 
}; 

Я хочу передать функцию processMagic в качестве аргумента callWithMagic, но я также хочу передать 42 в качестве второго параметра (theAnswer) в processMagic. Как я могу это сделать?

callWithMagic(<what should I put here?>); 
+0

Если вы хотите увидеть много тщательного ответа, увидеть этот вопрос и ответ, который на два года старше: Http: // stackoverflow.com/questions/21985201/pass-extra-parameters-to-jquery-ajax-promise-callback – JotaBe

ответ

28

Просто создать обертку обратного вызова:

callWithMagic(function(magic) { 
    return processMagic(magic, 42); 
}); 

Или с помощью ECMAScript :

callWithMagic(magic => processMagic(magic, 42)); 
+0

Спасибо, thats 'work'! Но только в первый раз, когда marketEvent это называется. Следующие вызовы возвращают undefined для значения newArg, но не для других двух. – Kulin

+0

@Kulin Это должно работать каждый раз. Вы получили его, чтобы работать, как вы отметили это как ответ? – str

+0

Это сообщение обсуждается на Meta - http://meta.stackoverflow.com/q/338481 (см. Комментарии к вопросу). Также уведомил об этом, Кюлин. – duplode

1

Вы можете использовать функцию Анонимус

что-то вроде

session.sub('Hello', function(){marketEvents(your args);}); 
+0

Это, безусловно, лучший ответ, спасибо! Может также использоваться с аргументом (аргументами) функции(), например. session.sub ('Hello', function (orgArg) {marketEvents (orgArg, your_args);}); – gregko

1

Вы можете создать функцию, которая вызывает функцию marketEvent. Нет необходимости усложнять

session.sub('Hello', function(args, kwargs) { 
    marketEvent(args, kwargs, 'my custom data'); 
}); 

иначе вы можете сделать это:

var mrktEvent = function(customArgs) { 
    return function(args, kwargs) { 
     marketEvent(args, kwargs, customArgs) 
    }; 
} 

session.sub('Hello', mrktEvent("customEvent")); 
Смежные вопросы