【问题标题】:Angular - Promise within Foreach LoopAngular - Foreach 循环中的承诺
【发布时间】:2018-07-09 14:49:34
【问题描述】:

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

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,如果您能提供帮助,不胜感激。

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

【问题讨论】:

    标签: angular promise


    【解决方案1】:

    试试这个。

    说明: 以下代码

    1. 创建一个Promise 数组,其中每个Promise 将解析为table + "," + column + "|" 字符串。
    2. Promise.all() 是否在创建的 Promise 数组上。这将解析为 table + "," + column + "|" 字符串数组。
    3. 返回一个 Promise,它将在步骤 2 中解析为一个字符串,该字符串导致 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();
                    })
            }
    

    【讨论】:

    • 非常感谢。这段代码在promises.push(promise) 给了我错误,它在运行时抱怨承诺“未定义”......
    • 在声明时忘记初始化承诺。现在应该可以正常工作了
    • 在浪费了很长时间之后非常有帮助。谢谢
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多