与承诺打交道的另一种方式。
(免责声明: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