Search code examples
sqliteangulartypescriptionic2resolver

How to load multiple data via service and wait for it in Angular2


I use Ionic 2 with Angular 2 in my project. In the root component you can click a "Add" button to add a new Report via a complex form and a lot of preprovided data (there are some selects that are feeded with data fetched from sqlite database) Now in my "CreateReportComponent" i have the following constructor to load the data and assign it to local array variable:

selectEmployeeOptions: Employee[];

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

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

But when I want to modify this data in my component, the array is empty. I tried to do it in ngOnInit() but this seems to be to early as well.

I want to to something like this, before the component gets displayed:

  dbService.getAllEmployees().then(employees => {
      this.selectEmployeeOptions = employees;

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

But selectEmployeeTitleOptions is empty...

The function in the databaseService looks like this:

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);
}

I read that there is the Resolve pattern (https://blog.thoughtram.io/angular/2016/10/10/resolving-route-data-in-angular-2.html) But I need to make multiple calls and not only for contacts as in the example.

So the question: How to wait for multiple calls to database?


Solution

  • i think something go wrong here

    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);
    }
    

    first return Promise.resolve(employeeList); will return empty array, because it is async process. you need loop through data.rows, then format return data like this.

    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;
      });
    }
    

    note that .then() return a promise object.