另一个尝试,来自承诺。
(免责声明:JS noob,来自 Python 世界。即使在那里,currying也没有被太多使用,但它有时会派上用场。所以我抄袭了 currying 函数 - 见链接)
首先,我从一个 ajax 调用开始。我对成功有一些特定的处理,但在失败时,我只想给用户反馈,调用某些东西会导致一些错误。在我的实际代码中,我在引导面板中显示错误反馈,但我只是在这里使用日志记录。
我已经修改了我的实时网址以使其失败。
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
现在,让我们稍微改变一下,使用一个可重用的通用故障处理程序,但也是一个在运行时使用已知代码时调用上下文和从事件中可用的运行时信息进行柯里化的处理程序。
... 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 中的广泛使用,currying 似乎是一个非常有用的工具。
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