我刚开始习惯使用ES6语法,我想知道是否可以使用箭头功能分配给变量。我正在编写一个基本的轻量级AJAX帮助程序库,状态为200,我想将一个有效负载返回给用户,我目前正在这样做:
var responseData = "";
switch (payload.returnType.toLowerCase()) {
case "json" : responseData = JSON.parse(httpRequest.responseText); break;
case "text" : responseData = httpRequest.responseText; break;
default : responseData = null; break;
}
callback(null, responseData);
这很好,但如果我这样做的话,我可以提供帮助,但我认为我可以做得更清洁:
callback(null, () => { switch(payload.returnType.toLowerCase()) { ... });
我希望return
语句将表达式的结果作为我的回调中的第二个参数发送,但是当我从调用者控制日志时它会输出switch语句。
或者我试过这样做:
var responseData = () => {
switch (payload.returnType.toLowerCase()) {
case "json" : return JSON.parse(httpRequest.responseText); break;
case "text" : return httpRequest.responseText; break;
default : return null; break;
}
}
callback(null, responseData);
在这种情况下,responseData
始终为空。是否可以将返回值作为我的第二个参数,或者将其作为箭头函数的结果绑定到responseData
?
答案 0 :(得分:8)
您创建一个匿名函数但不执行它。
例如:
var getResponseData = () => {
switch (payload.returnType.toLowerCase()) {
case "json" : return JSON.parse(httpRequest.responseText);
case "text" : return httpRequest.responseText;
default : return null;
}
};
callback(null, getResponseData());
答案 1 :(得分:5)
使用自执行功能,甚至更短:
let res = (() => {
return something;
})();
或使用您的代码:
var getResponseData = (() => {
switch (payload.returnType.toLowerCase()) {
case "json" : return JSON.parse(httpRequest.responseText);
case "text" : return httpRequest.responseText;
default : return null;
}
})();
您可以清楚地看到此片段中的区别:
let res1 = () => {
return "something";
};
let res2 = (() => {
return "something";
})();
console.log(res1);
console.log(res2);
答案 2 :(得分:0)
我认为你的预感是对的,但是你在错误的轨道上,imho。我认为你想要做的是为回调创建一个响应类型的地图:
let parsers = new Map([
["json", JSON.parse],
["text", (text) => text],
["_", () => null]
]), t = payload.returnType.toLowerCase();
if (!parsers.has(t)) {
t = "_";
}
callback(null, parsers.get(t)(httpRequest.responseText))
是什么让这主观和更清洁"是你将逻辑与实现分开。您可以将解析器定义移动到任何位置而不会影响代码。这就是为什么转换语句感觉不起作用的原因" (或不明确的)。
但当然,这一切都是品味问题:)