V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
qq316107934
V2EX  ›  问与答

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

  •  
  •   qq316107934 · 2016-06-30 04:20:43 +08:00 · 2556 次点击
    这是一个创建于 3060 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    尝试使用 flag 也是不行

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

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

    13 条回复    2016-06-30 10:02:46 +08:00
    shiny
        1
    shiny  
       2016-06-30 04:24:24 +08:00 via iPhone
    用 es7 的 async/await 。
    shiny
        2
    shiny  
       2016-06-30 04:26:30 +08:00 via iPhone   ❤️ 1
    只要 CheckUser 返回的是一个 Promise ,就可以 if(await CheckUser()) 了
    yyfearth
        3
    yyfearth  
       2016-06-30 04:38:30 +08:00   ❤️ 1
    如果要用 ES7 就可以用 async/await

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

    比如,连接数据库的代码,应该在单独的文件里,然后在应用初始化的时候,就连接完成。
    还有 Modal 的数据,应该在单独的文件中定义,然后通过 `mongoose.modal('user')` 来获取。
    另外,在任何一个回调函数中,都必须判断 `err`。
    shyling
        6
    shyling  
       2016-06-30 07:34:46 +08:00 via iPad
    为什么不能执行 succ_func,failed_func?
    vghdjgh
        7
    vghdjgh  
       2016-06-30 07:41:48 +08:00   ❤️ 1
    槽点略多,要理解 mongodb 只需要连一次,每个 error 都要处理;除了 async/await 解决 callback 之外,还需要把用到的 callback 封装成 promise ,再统一 catch 到 error 处理,就能避免处理每个 error 了
    visonme
        8
    visonme  
       2016-06-30 08:45:09 +08:00   ❤️ 1
    将功能分散到独立的模块中
    最大限度将返回的结果(错误 /成功)统一到一个 callback 中
    不妨尝试下 ES6 promise ,自己简单封装个,避开无限的 cb
    BOYPT
        9
    BOYPT  
       2016-06-30 08:56:55 +08:00
    可能楼主看的教程太古老了吧……
    mars0prince
        10
    mars0prince  
       2016-06-30 09:07:29 +08:00   ❤️ 1
    koa 你值得拥有
    keyfunc
        11
    keyfunc  
       2016-06-30 09:18:10 +08:00   ❤️ 1
    有种东西叫 promise
    yurivvvvv
        12
    yurivvvvv  
       2016-06-30 09:24:49 +08:00 via Android
    个人觉得,写异步用回调最直观...
    qq316107934
        13
    qq316107934  
    OP
       2016-06-30 10:02:46 +08:00 via Android
    @stiekel 学到了好多东西,谢谢!
    @vghdjgh 放弃使用 async 和 await 了, nodejs 暂时只支持到 ES6,改用 mongoose 自带的 promise
    @visonme 谢谢~正在理解 promise ,稍微有那么点麻烦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5191 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 09:19 · PVG 17:19 · LAX 01:19 · JFK 04:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.