JavaScript карри: каковы практические приложения? - PullRequest
169 голосов
/ 22 сентября 2008

Я не думаю, что я еще не начал карри. Я понимаю, что он делает, и как это сделать. Я просто не могу придумать ситуацию, в которой бы я ее использовал.

Где вы используете каррирование в JavaScript (или где его используют основные библиотеки)? Приветствуются манипуляции с DOM или общие примеры разработки приложений.

Один из ответов упоминает анимацию. Такие функции, как slideUp, fadeIn, принимают элемент в качестве аргументов и обычно являются карри-функцией, возвращающей функцию высокого порядка со встроенной «функцией анимации» по умолчанию. Почему это лучше, чем просто применять функцию более высокого уровня с некоторыми значениями по умолчанию?

Есть ли недостатки в его использовании?

В соответствии с просьбой, вот несколько хороших ресурсов по каррированию JavaScript:

Я добавлю больше по мере появления в комментариях.


Итак, согласно ответам, карри и частичное применение в целом являются удобными техниками.

Если вы часто «уточняете» высокоуровневую функцию, вызывая ее с одинаковой конфигурацией, вы можете каррировать (или использовать частичку Resig) высокоуровневую функцию для создания простых, лаконичных вспомогательных методов.

Ответы [ 15 ]

0 голосов
/ 08 апреля 2016

Еще один удар от работы с обещаниями.

(Отказ от ответственности: JS Noob, пришедший из мира Python. Даже там, карри используется не так уж много, но иногда может пригодиться. Поэтому я отключил функцию карри - смотрите ссылки)

Во-первых, я начинаю с вызова ajax. У меня есть какая-то конкретная обработка, которую нужно выполнить в случае успеха, но в случае неудачи я просто хочу дать пользователю отзыв, что вызов что-то привело к некоторая ошибка . В моем собственном коде я отображаю сообщение об ошибке на панели начальной загрузки, но я просто использую здесь запись.

Я изменил свой живой URL, чтобы сделать его неудачным.

function ajax_batch(e){
    var url = $(e.target).data("url");

    //induce error
    url = "x" + url;

    var promise_details = $.ajax(
        url,
        {
            headers: { Accept : "application/json" },
            // accepts : "application/json",
            beforeSend: function (request) {
                if (!this.crossDomain) {
                    request.setRequestHeader("X-CSRFToken", csrf_token);
                }
        },
        dataType : "json",
        type : "POST"}
    );
    promise_details.then(notify_batch_success, fail_status_specific_to_batch);
}

Теперь, чтобы сообщить пользователю о сбое пакета, мне нужно записать эту информацию в обработчик ошибок, потому что все, что он получает, - это ответ от сервера.

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

function fail_status_specific_to_batch(d){
    console.log("bad batch run, dude");
    console.log("response.status:" + d.status);
}

Давайте сделаем это. Консольный вывод:

Консоль

bad batch run, dude utility.js (line 109) response.status:404

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

    ... rest is as before...
    var target = $(e.target).text();
    var context = {"user_msg": "bad batch run, dude.  you were calling :" + target};
    var contexted_fail_notification = curry(generic_fail, context); 

    promise_details.then(notify_batch_success, contexted_fail_notification);
}

function generic_fail(context, d){
    console.log(context);
    console.log("response.status:" + d.status);
}

function curry(fn) {
     var slice = Array.prototype.slice,
        stored_args = slice.call(arguments, 1);
     return function () {
        var new_args = slice.call(arguments),
              args = stored_args.concat(new_args);
        return fn.apply(null, args);
     };
}

Консоль

Object { user_msg="bad batch run, dude. you were calling :Run ACL now"} utility.js (line 117) response.status:404 utility.js (line 118)

В более общем плане, учитывая, как широко используется обратный вызов в JS, каррирование кажется весьма полезным инструментом.

https://javascriptweblog.wordpress.com/2010/04/05/curry-cooking-up-tastier-functions/ http://www.drdobbs.com/open-source/currying-and-partial-functions-in-javasc/231001821?pgno=2

0 голосов
/ 20 августа 2015

Вы можете использовать встроенное связывание для быстрого решения одной строкой

function clampAngle(min, max, angle) {
    var result, delta;
    delta = max - min;
    result = (angle - min) % delta;
    if (result < 0) {
        result += delta;
    }
    return min + result;
};

var clamp0To360 = clampAngle.bind(null, 0, 360);

console.log(clamp0To360(405)) // 45
0 голосов
/ 01 июня 2013

Просто хотел добавить несколько ресурсов для Functional.js:

Лекция / конференция с объяснением некоторых приложений http://www.youtube.com/watch?v=HAcN3JyQoyY

Обновлена ​​библиотека Functional.js: https://github.com/loop-recur/FunctionalJS Несколько хороших помощников (извините, новенький здесь, без репутации: p): / Петли RECUR / PreludeJS

В последнее время я много использую эту библиотеку, чтобы уменьшить количество повторений в библиотеке помощников клиентов IRC js. Это отличный материал - действительно помогает очистить и упростить код.

Кроме того, если производительность становится проблемой (но эта библиотека довольно легкая), ее легко переписать с помощью встроенной функции.

0 голосов
/ 08 апреля 2011

Я только что написал пример jPaq, который показывает некоторые классные приложения функции карри. Проверьте это здесь: Функции Curring Up String

0 голосов
/ 07 февраля 2011

Я согласен с тем, что иногда вы хотели бы добиться успеха, создав псевдофункцию, в которой всегда будет заполнено значение первого аргумента. К счастью, я натолкнулся на совершенно новую библиотеку JavaScript с именем jPaq (h *) 1001 * ttp: //jpaq.org/), который обеспечивает эту функциональность. Самое лучшее в библиотеке - это то, что вы можете загрузить свою собственную сборку, которая содержит только тот код, который вам понадобится.

...