快被 nodeJS 的作用域和异步回调搞崩溃了

2016-06-30 04:20:43 +08:00
 qq316107934

最近在学 nodeJS ,感觉是为了避免 IO 阻塞,中间会用到很多回调。

于是乎原来 if(CheckUser){}...这种简单的代码变的极大复杂化了

尝试写了下面这段代码,但发现由于作用域问题完全无法执行 success_func()和 fail_func()

尝试使用 flag 也是不行

大家在用 nodejs 写类似代码的时候是怎么处理的呢?

不想把 app.get()代码粗暴的直接塞到判断结果里,想通过调用方式实现。

2592 次点击
所在节点    问与答
13 条回复
shiny
2016-06-30 04:24:24 +08:00
用 es7 的 async/await 。
shiny
2016-06-30 04:26:30 +08:00
只要 CheckUser 返回的是一个 Promise ,就可以 if(await CheckUser()) 了
yyfearth
2016-06-30 04:38:30 +08:00
如果要用 ES7 就可以用 async/await

不想增加额外的编译器 就用 Promise 好了
你返回一个 Promise 就不需要这么多 callback 了
qq316107934
2016-06-30 04:55:20 +08:00
@shiny
@yyfearth
非常感谢,我去看看 async/await.
stiekel
2016-06-30 07:27:01 +08:00
其实你主要的问题是,代码没有分布到不同的文件进行组织。

比如,连接数据库的代码,应该在单独的文件里,然后在应用初始化的时候,就连接完成。
还有 Modal 的数据,应该在单独的文件中定义,然后通过 `mongoose.modal('user')` 来获取。
另外,在任何一个回调函数中,都必须判断 `err`。
shyling
2016-06-30 07:34:46 +08:00
为什么不能执行 succ_func,failed_func?
vghdjgh
2016-06-30 07:41:48 +08:00
槽点略多,要理解 mongodb 只需要连一次,每个 error 都要处理;除了 async/await 解决 callback 之外,还需要把用到的 callback 封装成 promise ,再统一 catch 到 error 处理,就能避免处理每个 error 了
visonme
2016-06-30 08:45:09 +08:00
将功能分散到独立的模块中
最大限度将返回的结果(错误 /成功)统一到一个 callback 中
不妨尝试下 ES6 promise ,自己简单封装个,避开无限的 cb
BOYPT
2016-06-30 08:56:55 +08:00
可能楼主看的教程太古老了吧……
mars0prince
2016-06-30 09:07:29 +08:00
koa 你值得拥有
keyfunc
2016-06-30 09:18:10 +08:00
有种东西叫 promise
yurivvvvv
2016-06-30 09:24:49 +08:00
个人觉得,写异步用回调最直观...
qq316107934
2016-06-30 10:02:46 +08:00
@stiekel 学到了好多东西,谢谢!
@vghdjgh 放弃使用 async 和 await 了, nodejs 暂时只支持到 ES6,改用 mongoose 自带的 promise
@visonme 谢谢~正在理解 promise ,稍微有那么点麻烦

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

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

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

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

© 2021 V2EX