我对使用提供商获取并随后转发异步数据的最佳方式感到困惑......不幸的是,我不知道自己不知道什么,所以我的问题是充其量只是模糊不清。
为数据库或其他异步操作创建架构的最佳方法是什么,它将所有数据库/ http / etc调用保持在一起,但允许在调用页面上进行异步操作?例如,我想调用" this.provider.getDataFromDatabase()"然后在同一页面中使用数据。
我想我可以把问题归结为,"你把.then()放在哪里?"
以下是我玩过的一些事情的一些例子:
1。 Promise包含在promise方法中 - 在提供者中我写了承诺包含在promises中,其中内部promise是数据库/ http / etc调用,而外部promise是调用页面将执行的函数用于协调异步函数(使用.then())
.then()位置 - 异步调用的一个.then()位于提供程序中。另一个.then()位于处理包装器的调用页面中
Pro - 我能够完全将所有异步操作保留在提供程序中,并且我仍然可以协调调用页面中的操作。
Con - 看起来不必要的复杂,我一直在想我正在反对#34;承诺反模式"
< / p>
public getPeople() {
return new Promise((resolve, reject) => {
this.storage.executeSql("SELECT * FROM people", []).then((data) =>
{
console.log(data);
resolve(people);
}, (error) => { reject(error); });
});
}
的 2。返回一个promise方法 - 在提供程序中,代码就是设置数据库/ http / etc promise,它只是返回到调用页面,它使用.then()来协调操作。
.then()位置 - 在调用页面中只有一个。
Pro - 提供商中更简单的代码。
Con - 由于实际功能在调用页面中,因此数据提供者的想法似乎被破坏了。这似乎模糊了提供者和呼叫页面之间的界限
代码示例
public getPeople() {
return this.storage.executeSql("SELECT * FROM people", [])
}
第3。 EventEmitters方法 - 执行异步操作的所有代码都写在提供程序中。 .then()位于提供程序中,并通过事件将结果传递回页面。然后,subscribe事件协调页面本身的动作。
.then()位置 - 只有提供商中的一个
Pro - 提供商中更简单的代码。调用页面的代码更简单。提供程序中的所有异步操作以及页面中特定于页面的自定义代码。
Con - 由于调用函数和订阅函数不在一起,因此代码在页面中难以理解。&#34;另外,我总是觉得通过向卸载的页面发送数据会让自己陷入困境。
代码示例
public getPeople() {
this.storage.executeSql("SELECT * FROM people", []).then((data) =>
{
this.events.publish('getPeople', data);
}
}
我很好奇最佳做法是什么。我倾向于使用发射器方法,但我不知道是否存在一些我尚未遇到的隐藏问题。提前感谢您指出我正确的方向。
答案 0 :(得分:1)
提供者或服务或任何其他类, 必须在getter中返回一个值或Promise或Observable。
希望代码示例会有所帮助
class Product{}
class ProductsService{
getProduct(){
return new Product();
//or return Observable<Product>
//or return Promise<Product>;
}
}
class ProductPresenter{
private product: Product;
constructor(private _productService:ProductsService){
//so here must be sync or async way of getting a product to show
this.product = _productService.getProduct();
//or _productService.getProduct().then(() => {});
//or _productService.getProduct().subscribe(() => {});
}
}