如何通过服务加载多个数据并在 Angular2 中等待
How to load multiple data via service and wait for it in Angular2
我在我的项目中使用 Ionic 2 和 Angular 2。在根组件中,您可以单击 "Add" 按钮通过复杂的表单和大量预先提供的数据添加新的报告(有些选择是使用从 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 是空的...
数据库服务中的函数如下所示:
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);
}
我读到有 Resolve 模式 (https://blog.thoughtram.io/angular/2016/10/10/resolving-route-data-in-angular-2.html) 但我需要进行多次调用,而不仅仅是示例中的联系人。
所以问题是:如何等待对数据库的多次调用?
您正在寻找的是 returns Observable 的 forkJoin 方法,您应该切换到该方法而不是使用 Promises,以供参考为什么您应该进行此检查 。
来自其 GitHub 页面的关于 fork join 的简短信息:
Runs all observable sequences in parallel and collect their last elements.
这样您就可以安全地向您的 API 发出并行请求。
有关 forkJoin 的更多信息,请转到 here。
此外,您应该如前所述使用 ngOnInit 调用服务。有关 Angular 2 个生命周期挂钩的更多信息,请参阅 docs.
您可以使用 Promise.all
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
你将所有的承诺推送到一个数组,然后去
let foo : [Promise<Emplyoee[]>,Promise<void>] = [getAllEmployees(), method2()];
Promise.all(foo).then((results:any[]) => {
let employeearray: any = results[0];
/* and on an on */
});
我觉得这里出了点问题
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);
}
首先return Promise.resolve(employeeList);
将return空数组,因为它是异步过程。
您需要遍历 data.rows,然后像这样格式化 return 数据。
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() return 一个 promise 对象。
我在我的项目中使用 Ionic 2 和 Angular 2。在根组件中,您可以单击 "Add" 按钮通过复杂的表单和大量预先提供的数据添加新的报告(有些选择是使用从 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 是空的...
数据库服务中的函数如下所示:
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);
}
我读到有 Resolve 模式 (https://blog.thoughtram.io/angular/2016/10/10/resolving-route-data-in-angular-2.html) 但我需要进行多次调用,而不仅仅是示例中的联系人。
所以问题是:如何等待对数据库的多次调用?
您正在寻找的是 returns Observable 的 forkJoin 方法,您应该切换到该方法而不是使用 Promises,以供参考为什么您应该进行此检查
来自其 GitHub 页面的关于 fork join 的简短信息:
Runs all observable sequences in parallel and collect their last elements.
这样您就可以安全地向您的 API 发出并行请求。
有关 forkJoin 的更多信息,请转到 here。
此外,您应该如前所述使用 ngOnInit 调用服务。有关 Angular 2 个生命周期挂钩的更多信息,请参阅 docs.
您可以使用 Promise.all https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
你将所有的承诺推送到一个数组,然后去
let foo : [Promise<Emplyoee[]>,Promise<void>] = [getAllEmployees(), method2()];
Promise.all(foo).then((results:any[]) => {
let employeearray: any = results[0];
/* and on an on */
});
我觉得这里出了点问题
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);
}
首先return Promise.resolve(employeeList);
将return空数组,因为它是异步过程。
您需要遍历 data.rows,然后像这样格式化 return 数据。
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() return 一个 promise 对象。