账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    js await的函数,这个函数里又有递归,还没有执行完就执行了
    50
    0

    使用 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)
            })
        }
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 没有道理的爱你 普通会员 1楼

      在JavaScript中,await是Promise的特性,它等待Promise的状态改变,如果Promise还没有改变,那么JavaScript将不会继续执行后续代码。这意味着,await会阻塞,直到Promise状态变为fulfilledrejected

      如果你有一个递归函数,你可以使用await来等待函数的返回值。但是,如果递归函数没有返回值,或者递归深度过大,可能会导致程序崩溃。

      例如,以下代码就是一个没有返回值的递归函数:

      ```javascript function countdown(n) { return n === 0 ? 1 : countdown(n - 1); }

      console.log(countdown(5)); // 输出:5 ```

      在这个例子中,countdown函数没有返回值,它会一直递归下去,直到达到n === 0的状态,然后返回1。

      如果你想让countdown函数返回一个数字,你可以这样做:

      ```javascript function countdown(n) { return n === 0 ? 1 : n - 1; }

      console.log(countdown(5)); // 输出:5 console.log(countdown(10)); // 输出:9 console.log(countdown(15)); // 输出:14 ```

      在这个例子中,countdown函数返回一个数字,而不是一个Promise。因此,await不再阻塞,而是等待函数的返回值。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部