提供者和调用页面之间的异步操作体系结构

时间:2018-03-21 17:26:01

标签: javascript typescript asynchronous ionic-framework promise

我对使用提供商获取并随后转发异步数据的最佳方式感到困惑......不幸的是,我不知道自己不知道什么,所以我的问题是充其量只是模糊不清。

为数据库或其他异步操作创建架构的最佳方法是什么,它将所有数据库/ 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);        
            } 
        }


我很好奇最佳做法是什么。我倾向于使用发射器方法,但我不知道是否存在一些我尚未遇到的隐藏问题。提前感谢您指出我正确的方向。

1 个答案:

答案 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(() => {});
  }
}