【问题标题】:angularfire2 timeout and cancel for saving dataangularfire2超时并取消以保存数据
【发布时间】:2017-06-12 04:51:43
【问题描述】:

我想为 firebase 数据库保存数据设置超时和取消。 当前代码如下

import {AngularFireDatabase} from 'angularfire2/database';
export class XXX{

 constructor(private af_db: AngularFireDatabase){} 

 const items = this.af_db.list('/path');
 const promise = items.push(data);
 promise.then(()=>{

 }).catch((err)=>{

 })

在这段代码中,当用户离线时,它一直等待网络连接,连接建立后,执行保存数据。 我想为它设置两个功能

取消: 当用户点击“关闭”按钮时,正在进行的保存过程停止。

超时: 开始处理保存后超过 3 秒后,保存过程结束并显示“重试”。

【问题讨论】:

    标签: angular promise timeout angularfire2


    【解决方案1】:

    取消。您无法取消承诺,一旦操作开始,您就无法控制它。

    超时。如果您想对此特定操作使用超时,那么我相信这是不可能的。即使您在 3 秒后向用户显示超时消息,操作本身也在进行中,并且稍后会成功或失败。

    【讨论】:

    • 非常感谢您的澄清。我发现在不稳定的网络连接情况下保存数据效果不佳,我需要想办法将情况通知给用户。
    【解决方案2】:

    您可以在 Cloud Functions 中编写一个简单的 API(使用 Express)。然后为 HTTP 设置一个超时并使用 Observable.retry,可能是这样的:

    import 'rxjs/add/operator/retry';
    import 'rxjs/add/operator/timeout';
    this.sub = this.http.post(urlToYourCloudFunction, data, {timeout: 1000, headers:{authorization: this.authToken}})
        .retry(3)
        .timeout(4000);
    

    取消:

    if (this.sub) { this.sub.unsubscribe(); }
    

    不是 100% 证明的。在 Cloud Functions 向您发送回复期间,您仍然可能会失去连接。如果它是推送而不是更新,那么您最终可能会得到重复。您可以通过在客户端创建密钥从而使其成为“upsert”来避免这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多