为了账号安全,请及时绑定邮箱和手机立即绑定

js await的函数,这个函数里又有递归,还没有执行完就执行了

js await的函数,这个函数里又有递归,还没有执行完就执行了

回首忆惘然 2019-03-15 14:15:49
使用 async await来操作函数异步,函数体内有递归,但是递归还没有完成就执行完了函数。then里面的返回值是个数组但是数组打印的长度是1,但真实长度应该是5,打断点调试res的第一个返回值是一个长度为1的数组,但是紧接着就是长度为5的数组,await不是应该等getAllDownRoteEquipment函数执行完了再返回值吗?请求大神解答    getAllDownRoute(){        viewer.vmethods.getAllDownRoteEquipmentArr().then(function(res){            console.log(res)        })    }    async getAllDownRoteEquipmentArr(id){              var equipmentArr = [];                var selectIds = viewer.getSelection()[0];                await viewer.vmethods.getAllDownRoteEquipment(selectIds,equipmentArr);                return equipmentArr;    }    getAllDownRoteEquipment(id,equipmentArr){        return new Promise(function (resolve) {            var aa = (id,equipmentArr)=>{                viewer.getProperties(id,function(res) {                    for (var i = 0; i < res.properties.length; i++) {                        if (res.properties[i].displayName == "型号") {                            var downEquipment = res.properties[i].displayValue;                            equipmentArr.push(downEquipment);                            resolve(equipmentArr);                            viewer.search(downEquipment,(searchId) =>{                                aa(searchId[0],equipmentArr)                            },function(){},"自身标识");                            break;                        }                    }                })            }            aa(id,equipmentArr)        })    }
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

resolve(equipmentArr)之后这个promise状态就不会改变了,然后await执行就结束了。放在里面是可以的,但是你要判断递归的结束条件,递归到结尾的时候才能执行resolve。


查看完整回答
反对 回复 2019-03-21
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

问题出在aa函数里的这一句resolve(equipmentArr);,调用resolve就返回了,然后才执行后面的循环和递归的。


查看完整回答
反对 回复 2019-03-21
  • 2 回答
  • 0 关注
  • 1497 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信