При изучении API незнакомой библиотеки или модуля может быть удобно распечатать аргументы функций обратного вызова, переданные в методы библиотеки, часто включая аргументы, которые вы изначально передали этим методам.
someLib.someCoolStuff(a, b, (foo, bar) => { console.log('someCoolStuff', a, b, foo, bar); }); someLib.someCoolStuff(c, (foo, bar) => { console.log('someCoolStuff', c, foo, bar); }); someLib.otherRadThing(d, (herp, derp) => { console.log('otherRadThing', d, herp, derp); });
Используя некоторые функции ES6 и немного кода в гольф, вы можете создать лаконичную фабрику карри, чтобы помочь в такого рода исследованиях.
const curryception = (f) => (...r) => f.bind(f, ...r);
У тебя не инсульт! Это функция, которая принимает функцию, а затем возвращает другую функцию, которая также возвращает функцию, которая запускает исходную функцию.
Все аргументы, переданные возвращаемым функциям по пути, передаются вашей исходной функции.
const kick = curryception((...r) => console.warn(...r)); kick('Cobb', 'Eames', 'Mal')('Ariadne', 'Saito', 'Fischer'); // ⚠ Cobb Eames Mal Ariadne Saito Fischer
Вы можете использовать потрясающую мощь curryception, чтобы упростить передачу отладочных обратных вызовов. Вот менее надуманный пример, демонстрирующий полезность этих 27 байт вкусного карри:
const log = curryception(console.log.bind(console)); const getRequest = new ioUtil.Request({ ... }); const postRequest = new ioUtil.Request({ ... }); ioUtil.get(getRequest, log('get', getRequest)); ioUtil.post(postRequest, log('post', postRequest));
И возвращаясь к исходному примеру someLib
:
someLib.someCoolStuff(a, b, log('someCoolStuff', a, b)); someLib.someCoolStuff(c, log('someCoolStuff', c)); someLib.otherRadThing(d, log('otherRadThing', d));
Это особенно полезно, когда вы не уверены в количестве возвращаемых аргументов, так как будут напечатаны все аргументы, переданные как вашей currycepted-функции, так и вашим обратным вызовам.
При currycepting вы можете привязать контекст this
ваших обратных вызовов к функции, которую вы передаете curryception()
, или использовать функцию стрелки для наследования окружающего контекста.
curryception(func.bind(context)); curryception((...rest) => { // Do something with ...rest and outer `this`. });
Мы должны пойти глубже
Добавление дополнительных пар элементов отдыха и распространения может помочь вам еще больше раздуть ваш средний пост о новинках ES6.
const curryception = (f, ...a) => (...b) => f.bind(f, ...a, ...b); const boundLog = console.log.bind(console); const ioLog = curryception(boundLog, 'ioUtil'); const renderLog = curryception(boundLog, 'renderUtil'); const request = new ioUtil.Request({ ... }); ioUtil.get(request, ioLog('get', request)); renderUtil.drawCanvas({ ... }, renderLog('drawCanvas'));
ES6 предлагает элегантные и мощные способы рассказать о JavaScript. ;)