2017-06-12 1 views
0

Je souhaite définir le délai d'attente & pour les données d'enregistrement de base de données Firebase. code actuel est le suivantDélai d'attente angularfire2 et annulation pour enregistrer les données

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)=>{ 

}) 

Dans ce code, lorsque l'utilisateur est hors ligne, il continuer à attendre pour la connexion réseau, et après la connexion établie, la sauvegarde des données est exécutée. Je veux définir deux caractéristiques pour elle

cancel: lorsque l'utilisateur clique bouton « fermer », en cours de processus de sauvegarde est arrêté.

délai d'attente : lorsque plus de 3 secondes se sont écoulées après le début de processus de sauvegarde, le processus d'enregistrement terminé et montrer « essayer à nouveau ».

Répondre

1

Annuler. Vous ne pouvez pas annuler les promesses, dès que l'opération a commencé, vous n'avez aucun contrôle sur elle.

Délai d'attente. Si vous voulez utiliser le timeout pour cette opération spécifique, je crois que ce n'est pas possible. Même si vous affichez un message de délai à un utilisateur après 3 secondes, l'opération elle-même est en cours et réussira ou échouera plus tard.

+0

Merci beaucoup pour votre clarification. J'ai découvert que la sauvegarde des données ne fonctionne pas bien dans la connexion Internet instable, je dois trouver un moyen de notifier la situation à l'utilisateur. –

0

Vous pouvez écrire une API simple (avec Express) dans les fonctions Cloud. Définissez ensuite un délai d'attente pour HTTP et jouer avec Observable.retry, peut-être quelque chose comme:

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

Interrompre:

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

est-ce pas une preuve de 100%. Il est toujours possible que vous perdiez la connexion pendant le temps nécessaire à Cloud Functions pour vous renvoyer une réponse. Et si c'est un push, pas une mise à jour, vous pourriez vous retrouver avec des doublons. Vous pouvez éviter cela en créant la clé côté client, ce qui en fait un "upsert".