如何才能减少代码的嵌套层级?

2018-05-03 14:51:44 +08:00
 kuoruan

Linus Torvalds:

If you need more than 3 levels of indentation, you ’ re screwed anyway, and should fix your program.

如果你的代码里需要有超过三层的缩进,那么你已经搞砸了,应该修改你的代码。

这里贴一段我写的代码

function do_kcptun_update(btn) {
	btn.disabled = true;
	btn.value = '<%:Downloading...%>';
	add_remove_page_notice(true);
	var kcptun_update_url = '<%=dsp.build_url("admin/services/kcptun/update/kcptun")%>';
	(new XHR()).get(kcptun_update_url, {
		token: token_str,
		url: kcptun_info ? kcptun_info.url.download : ''
	}, function (x, json) {
		if (x && x.status == 200) {
			if (json.code == 0) {
				btn.value = '<%:Extracting...%>';
				(new XHR()).get(kcptun_update_url, {
					token: token_str,
					task: "extract",
					file: json.file,
					subfix: kcptun_info ? kcptun_info.type : ''
				}, function (x, json) {
					if (x && x.status == 200) {
						if (json.code == 0) {
							btn.value = '<%:Moving...%>';
							(new XHR()).get(kcptun_update_url, {
								token: token_str,
								task: "move",
								file: json.file
							}, function (x, json) {
								if (x && x.status == 200) {
									if (json.code == 0) {
										on_update_success(btn);
									} else {
										on_request_error(btn, json);
									}
								} else {
									on_request_error(btn);
								}
							});
						} else {
							on_request_error(btn, json);
						}
					} else {
						on_request_error(btn);
					}
				});
			} else {
				on_request_error(btn, json);
			}
		} else {
			on_request_error(btn);
		}
	});
}

这是一段用来更新程序的 JavaScript,但是代码的继续执行依赖于上一次请求的成功执行。 可苦于没有好的优化方案,只能写出这种垃圾代码了。

7059 次点击
所在节点    程序员
51 条回复
xpol
2018-05-03 22:19:51 +08:00
GraphQL 了解一下。
xpol
2018-05-03 22:23:05 +08:00
我以为都是从服务器请求数据:),请忽略我上一条回复。
mingyun
2018-05-03 23:47:44 +08:00
提前 return
pepesii
2018-05-04 08:41:10 +08:00
我记得上初中的时候,数学老师经常说的一句话是,“正难则反”,于是我在碰到真值条件复杂的时候,就找假条件先处理,提前返回。
crayygy
2018-05-04 09:51:41 +08:00
打开帖子以前看到标题的第一反应就是 JS 的回调地狱...
th00000
2018-05-04 09:59:27 +08:00
快速失败原则
ikaros
2018-05-04 10:03:53 +08:00
你这样写以后再来看不觉得麻烦吗?
SakuraKuma
2018-05-04 10:19:07 +08:00
Promise 啊。

kcptun.download().then(extract).then(move).catch(onError)
f0rger
2018-05-04 11:33:10 +08:00
大概长这样,没调,可能有语法和写法错误:
https://gist.github.com/luoweihua7/58b884ce7ecd618bb27fbe8fa9b4cf72
zhuweiyou
2018-05-04 12:10:19 +08:00
一个是用 async / await

一个是先 return 错误的,就不会嵌套多层了
bangbaoshi
2018-05-04 15:30:16 +08:00
·····
if (cond1) {
if (cond2) {
if (cond3) {
do something
}
}
}
·····
改成
·····
if(!cond1) {
return;
}
if(!cond2) {
return;
}
if(!cond3) {
return;
}
do something
·····

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/451758

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX