使用promises循环后没有代码被执行

时间:2018-06-01 11:48:20

标签: javascript es6-promise

所以我有一个函数,它接受一个id并通过promise返回相应的属性映射。所以我做了一个循环并用我的所有ID迭代我的函数,但它从不执行循环之外的代码。

async getProps(dbId) {
    const properties = Viewer.properties //creates an empty map
    return new Promise((resolve, reject) => {
            let prom = new Promise((resolve, reject) => {
                this.gui.getProperties(
                    dbId,
                    args => {
                        console.log('properties', args)
                        resolve(args.properties)
                    },
                    reject
                )
            })

            prom.then(props => {
                properties.set(dbId, props)
                resolve(properties.entries())
            })
            console.log('properties', properties)
        }
    )
}

我想要的是创建一个ID为键的映射,以及属性数组作为值。这是按预期发生的。

这就是我使用函数

的方法
async getConcreteIds() {
    let wallfloorids = this.getWallIds().concat(this.getFloorIds());
    // let concreteIds = [];
    for(let id of wallfloorids) {
        let p1 = await this.view.getProps(id);
        console.log(p1);
    }
    console.log("Hello");
}

我遍历我的ID并调用getProperties函数,并按预期记录地图。但它永远不会离开循环。 wallfloorids有52个条目,因此它不是无限循环。 我认为我的getProperties函数的结构是原因,但我不知道要改变什么。我尝试更改结构,但随后它返回一个空映射,其余代码被执行。 谢谢!

1 个答案:

答案 0 :(得分:0)

现在状态

getProperties(dbId) {
    const properties = Viewer.properties
    return new Promise((resolve, reject) => {
        this.gui.getProperties(
            dbId,
            args => {
                resolve(args.properties)
            },
            reject
        )
    })

}


async getConcreteIds() {
    let wallfloorids = this.getWallIds().concat(this.getFloorIds());
    let concreteIds = [];
    for (let id of wallfloorids) {
        let p1 = await this.view.getProperties(id);
        console.log(p1);
            for (let prop of p1){
                if (prop.displayCategory === "Materialien und Oberflächen" && prop.displayValue.contains("Concrete"))
                    concreteIds.push(id);
            }
    }
    return concreteIds;
}

onlyConcrete() {
    let ids = [];
    const concreteIds = this.getConcreteIds();
    console.log(concreteIds);
    this.viewer.isolateById(concreteIds)
}