我在我的项目中使用了离子2和角2。在根组件中,您可以单击“添加”按钮,通过复杂的形式和大量预先提供的数据添加新报表(其中有一些选择是从SQLite数据库获取的数据提供的)。
现在在我的“createreportcomponent”中,我有以下构造函数来加载数据并将其分配给本地数组变量:

selectEmployeeOptions: Employee[];

constructor(private dbService: DatabaseService) {
  dbService.getAllEmployees().then(employees => {
      this.selectEmployeeOptions = employees;
  });

  // load more data like tasks etc.
});

但是当我想修改组件中的数据时,数组是空的。我试着在ngoninit()中这样做,但这似乎也太早了。
在组件显示之前,我想这样做:
  dbService.getAllEmployees().then(employees => {
      this.selectEmployeeOptions = employees;

      // modify data
      this.selectEmployeeTitleOptions = employees.map((item) => {
         return item.title;
      });
      console.log(JSON.stringify(this.selectEmployeeTitleOptions)) // --> empty
  });

但SelectEmployeeTitleOptions为空…
databaseservice中的函数如下所示:
getAllEmployees(): Promise<Emplyoee[]> {
  let query = "SELECT * FROM employees";
  let employeeList = [];
  this.database.executeSql(query, []).then((data) => {
     if(data.rows.length > 0) {
       let e = new Employee();
       e.id = data.rows.item(i).id;
       e.firstname = data.rows.item(i).firstname;
       e.lastname = data.rows.item(i).lastname;
       employeeList.push(e);
     }
  }, (error) => {
     // handle error
  });
  return Promise.resolve(employeeList);
}

我读到有解析模式(https://blog.thoughtram.io/angular/2016/10/10/resolving-route-data-in-angular-2.html),但我需要打多个电话,而不是像示例中那样只打给联系人。
所以问题是:如何等待对数据库的多次调用?

最佳答案

我想这里出了点问题

getAllEmployees(): Promise<Emplyoee[]> {
  let query = "SELECT * FROM employees";
  let employeeList = [];
  this.database.executeSql(query, []).then((data) => {
     if(data.rows.length > 0) {
       let e = new Employee();
       e.id = data.rows.item(i).id;
       e.firstname = data.rows.item(i).firstname;
       e.lastname = data.rows.item(i).lastname;
       employeeList.push(e);
     }
  }, (error) => {
     // handle error
  });
  return Promise.resolve(employeeList);
}

首先,将返回空数组,因为它是异步进程。
您需要遍历data.rows,然后像这样格式化返回数据。
getAllEmployees(): Promise<Employee[]> {
  let query = "SELECT * FROM employees";
  return this.database.executeSql(query, []).then((data) => {
    let arr = [];
    for(let i = ; i < data.rows.length; ++i) {
      let emp = data.rows.item(i);
      let e = new Employee();
      e.id = emp.id;
      e.firstname = emp.firstname;
      e.lastname = emp.lastname;
      arr.push(e);
    }
    return arr;
  });
}

注意.then()返回一个promise对象。

关于sqlite - 如何通过服务加载多个数据并在Angular2中等待它,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42003460/

10-11 19:26
查看更多