我正在使用Ionic并使用Angular firestore并具有离线持久性。 在线时,我可以在'then'括号中做一些事情,但在离线时没有任何事情发生。
添加或更新方法适用于这两种情况,但我需要一些回调来通知用户。 我发现的唯一方法是在构造函数中订阅。 问题:还有其他最佳方法吗?
import { AngularFirestore, AngularFirestoreCollection } from 'angularfire2/firestore';
...
export class MyPage {
placeRef: AngularFirestoreCollection<Place>;
constructor(... public afs: AngularFirestore) {
this.placeRef.valueChanges()
.subscribe(actions => {
if (this.totPlaces < actions.length && this.totPlaces != 0) { this.onUploadComplete(); }
this.totPlaces = actions.length;
})
}
updateName(dataObj: any): Promise<any> {
return new Promise((resolve, reject) => {
this.afs
.collection("collection-id")
.doc("doc-id")
.update(dataObj)
.then((obj: any) => {
resolve(obj);
console.log("ok modified");
})
.catch((error: any) => {
console.log("nok error");
reject(error);
});
});
}
...
this.placeRef = this.afs.collection<Place>("collection-id");
addPlace() {
let d = new Date();
let nd = new Date(d.getTime());
this.placeRef.add({
name: ...,
note: ...,
...
})
/* see workaround "this.placeRef.valueChanges"
.then((docRef) => {
// only if mobile datas or wifi enabled
console.log("Document written with ID: ", docRef.id);
//this.onUploadComplete();
}).catch((error) => {
console.error("Error adding document: ", error);
});*/
}
}
答案 0 :(得分:0)
您可以创建一个始终返回此类承诺的函数。
add(data: any): Promise<any> {
let obj = collection.add({
...data
});
// If internet connection is available
if(navigator.onLine && obj instanceof Promise && typeof obj.then === 'function') {
return obj;
}
else {
return new Promise((resolve, reject) => {
resolve({action: 'ADD', mode: 'offline'});
});
}
}
您必须测试'obj'变量才能知道它是否是一个承诺并且具有'then
'功能。