鍍金池/ 問答/HTML/ js await的函數(shù),這個(gè)函數(shù)里又有遞歸,還沒有執(zhí)行完就執(zhí)行了

js await的函數(shù),這個(gè)函數(shù)里又有遞歸,還沒有執(zhí)行完就執(zhí)行了

使用 async await來操作函數(shù)異步,函數(shù)體內(nèi)有遞歸,但是遞歸還沒有完成就執(zhí)行完了函數(shù)。then里面的返回值是個(gè)數(shù)組但是數(shù)組打印的長度是1,但真實(shí)長度應(yīng)該是5,打斷點(diǎn)調(diào)試res的第一個(gè)返回值是一個(gè)長度為1的數(shù)組,但是緊接著就是長度為5的數(shù)組,await不是應(yīng)該等getAllDownRoteEquipment函數(shù)執(zhí)行完了再返回值嗎?請(qǐng)求大神解答

    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 == "型號(hào)") {
                            var downEquipment = res.properties[i].displayValue;
                            equipmentArr.push(downEquipment);
                            resolve(equipmentArr);
                            viewer.search(downEquipment,(searchId) =>{
                                aa(searchId[0],equipmentArr)
                            },function(){},"自身標(biāo)識(shí)");
                            break;
                        }
                    }
                })
            }
            aa(id,equipmentArr)
        })
    }
回答
編輯回答
真難過

resolve(equipmentArr)之后這個(gè)promise狀態(tài)就不會(huì)改變了,然后await執(zhí)行就結(jié)束了。放在里面是可以的,但是你要判斷遞歸的結(jié)束條件,遞歸到結(jié)尾的時(shí)候才能執(zhí)行resolve。

2018年9月16日 15:20
編輯回答
毀憶

問題出在aa函數(shù)里的這一句resolve(equipmentArr);,調(diào)用resolve就返回了,然后才執(zhí)行后面的循環(huán)和遞歸的。

2018年4月19日 15:12