Angular-Foreach循环内的承诺

时间:2018-07-09 14:49:35

标签: angular promise

下面的代码有问题,因为它没有返回任何内容。我该如何解决?

public checkExistence(value: Item, tableName: string, schema: string): Promise<string>{
  var result = "";
  this.configData.forEach(element => {
    if(element.key.tableName === tableName && element.checkExist != null){
      let uiValue = value[element.key.columnName];
      let refTargets = element.checkExist.split("|");
      refTargets.forEach(target => {
        let targetTableColumn = target.split(',', 2);
        let table = targetTableColumn[0];
        let column = targetTableColumn[1];
         this.getRefData(schema,table,column).then((value: string[]) => {
          if (!(value.indexOf(uiValue) > -1)){
           result = result + table + "," + column + "|";
          }
        })
      });
    }
  });
}

此功能的全部目的是检查某些参考表的某些列中value[element.key.columnName]的存在。可能有多个参考表要检查(因此有refTargets.forEach)。

我最终希望此函数返回一个字符串,该字符串表示不包含该值的表/列的列表。

发现了类似情况,但不确定如何将其应用于我的情况。 Angular chaining promises from foreach loop

开始学习Angular和Promise,并感谢您的帮助。

如果您认为本函数可以用更好的方式编写,请告诉我。如果可以的话,我会接受的:)

1 个答案:

答案 0 :(得分:1)

尝试一下。

说明: 以下代码

  1. 创建一个Promise数组,其中每个Promise都将解析为table + "," + column + "|"字符串。
  2. 对创建的Promise.all()数组执行Promise。这将解析为table + "," + column + "|"个字符串数组。
  3. 在步骤2中返回一个Promise,它将解析为一个字符串,导致table + "," + column + "|"个字符串数组的合并。

代码:

public checkExistence(value: Item, tableName: string, schema: string): Promise<string>{
            // var result = "";
            let promises:Promise<string>[] = [];
            this.configData.forEach(element => {
                if(element.key.tableName === tableName && element.checkExist != null){
                    let uiValue = value[element.key.columnName];
                    let refTargets = element.checkExist.split("|");
                    refTargets.forEach(target => {
                        let targetTableColumn = target.split(',', 2);
                        let table = targetTableColumn[0];
                        let column = targetTableColumn[1];
                        let promise: Promise<string> = this.getRefData(schema,table,column).then((value: string[]) => {
                            if (!(value.indexOf(uiValue) > -1)){
                                return /*result = result + */ table + "," + column + "|";
                            }
                            return "";
                        });

                        promises.push(promise);
                    });
                }
            });
            return Promise.all(promises)
                .then((results:string[])=>{
                    return results.join();
                })
        }