[Node]使用return替代else,处理异步回调问题(二次回调)

下面一段代码片

CloudCtl.Instructions2.Clean[logic.instructions.Clean.class].Handler.call(self, userID, deviceID, deviceRealm, dResource, jCtl, extra, (err) => {
                if (err) {
                    if(jCtl.type == "move"){
                        CloudCtl.Instructions2.GetMapState[logic.instructions.GetMapState.class].Handler.call(self, userID, deviceID, deviceRealm, dResource, jCtl, extra, (err, data) => {
                            //state:地图状态,string;none - 未建图,building - 正在建图,s_build - 建图未完成 ,built - 建图完成,preparing - 工作准备中
                            jCtl.state = data.state || "none";
                            if ( err || jCtl.state == "built") {
                                return cb(null, {ret: "fail", errno: err.errno});
                            }
                            jCtl.type = "explore"
                            CloudCtl.Instructions2.Clean[logic.instructions.Clean.class].Handler.call(self, userID, deviceID, deviceRealm, dResource, jCtl, extra, (err) => {
                                if (err) {
                                    return cb(null, {ret: "fail", errno: err.errno});
                                }
                                return cb(null, {ret: "ok"});
                            })
                        })
                    }
                    return cb(null, {ret: "fail", errno: err.errno});
                }
                return cb(null, {ret: "ok"});

上面这段代码错误:
在代码进入

	if(jCtl.type == "move")

之后,等待GetMapState异步回调的过程中,就会跳出if。进入

    return cb(null, {ret: "fail", errno: err.errno});

这种情况下,等异步回调进来就会二次回调

解决方法一:
	  return cb(null, {ret: "fail", errno: err.errno});

套在else中

解决方法二 :

在if中return:

  CloudCtl.Instructions2.Clean[logic.instructions.Clean.class].Handler.call(self, userID, deviceID, deviceRealm, dResource, jCtl, extra, (err) => {
                if (err) {
                    if(jCtl.type == "move"){
                        CloudCtl.Instructions2.GetMapState[logic.instructions.GetMapState.class].Handler.call(self, userID, deviceID, deviceRealm, dResource, jCtl, extra, (err, data) => {
                            //state:地图状态,string;none - 未建图,building - 正在建图,s_build - 建图未完成 ,built - 建图完成,preparing - 工作准备中
                            jCtl.state = data.state || "none";
                            if ( err || jCtl.state == "built") {
                                return cb(null, {ret: "fail", errno: err.errno});
                            }
                            jCtl.type = "explore"
                            CloudCtl.Instructions2.Clean[logic.instructions.Clean.class].Handler.call(self, userID, deviceID, deviceRealm, dResource, jCtl, extra, (err) => {
                                if (err) {
                                    return cb(null, {ret: "fail", errno: err.errno});
                                }
                                return cb(null, {ret: "ok"});
                            })
                        })
                        return   //此处
                    }
                    return cb(null, {ret: "fail", errno: err.errno});
                }
                return cb(null, {ret: "ok"});
            })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值