CNode

像这种代码用node如何才能写的比较不反人类

问答
Sshuhari发布于10 年前最后回复10 年前6 回复3997 浏览0 收藏

用同步的话大概是这样的逻辑: var server = connectServer(); try { foreach (var task in tasks) { if (!server.execSync(task)) break; } } catch(Exception e) { ... } finally { e.Close(); } 但如果exec方法是用的异步API,并且要保证:

  1. 任何地方抛出的错误都能被捕获;
  2. 各个任务依次执行而不是异步执行;
  3. 如果某个任务失败,后续任务都不要再执行

我用nodejs大概实现了一下,发现异步情况下控制循环这么简单的事情都变得很麻烦,最后代码复杂到我自己都想吐了....求教有没有简单清晰的写法

查看回复

回复 (6)

N
ncuzp#1·10 年前

Promise.resolve() .then(() => { foreach (var task in tasks) { if (!server.execSync(task)) break; } return Promise.resolve(); }) .catch((e)=>console.log(e));

S
shuhari#2·10 年前

感谢,不过你这个代码好像不满足: 任务顺序执行,如果一个失败了后续的不要再继续

Q
qimenxiaozi#3·10 年前

用一个promise factory的东西应该可以搞定

C
CoderIvan#5·10 年前

利用 cogenerator 可能会比较舒服

co(function*(){
	var server = connectServer();
	try {
		foreach (var task in tasks) {
			if (yield !server.execSync(task)) break;
		}
	} catch(Exception e) {
		
	} finally {
		e.Close();
	}
})
D
DevinXian#6·10 年前

es6和es7都有解决方案咯~es5还是用一些工具库,async, bb...etc.

参与回复
登录后即可参与回复。登录