从承诺的价值缺少时间

时间:2018-06-02 16:01:53

标签: javascript es6-promise autodesk-forge

所以我使用Forge和View API来分析包含混凝土的模型中的所有零件,并隐藏一些不具体的东西。问题是检查混凝土的属性是从DB调用的,这需要我做一个承诺。检查混凝土是否按预期工作,然后问题开始。我返回包含混凝土的Ids,但是我的函数应该隐藏它,在解析promise之前使用Ids,所以数组是空的。 console.log按预期记录它,但其他一切都错过了时间。 我的代码:

getProperties(dbId) {
    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 = this.view.getProperties(id);
        p1.then(props => {
            for (let prop of props) {
                if (prop.displayCategory === "Materialien und Oberflächen" && prop.displayValue.contains("Concrete")) {
                    concreteIds.push(id);
                }
            }
        }).catch(() => {
        });
    }
    return new Promise((resolve, reject) => {
        try {
            resolve(concreteIds)
        } catch (e) {
            console.log("Err", reject)
        }
    })
}


async onlyConcrete() {
    this.getConcreteIds().then(concrete => {
        debugger;
        this.viewer.isolateById(concrete)
    });
}

1 个答案:

答案 0 :(得分:0)

为你的循环映射一个promises数组,并使用Promise.all()在循环解析中的所有promise之后解析

类似的东西:

async getConcreteIds() {
  let wallfloorids = this.getWallIds().concat(this.getFloorIds());

  let concreteIds = [];

  let promises = wallfloorids.map(id => {
    let p1 = this.view.getProperties(id);
    return p1.then(props => {
      for (let prop of props) {
        if (prop.displayCategory === "Materialien und Oberflächen" && prop.displayValue.contains("Concrete")) {
          concreteIds.push(id);
        }
      }
    });
  });

  return Promise.all(promises)
    .then(_ => concreteIds)
    .catch(err => console.log("Err", err))
}