Еще один удар от работы с обещаниями.
(Отказ от ответственности: 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