Angular firebase 获取单个项目存在竞争条件
Angular firebase fetching single item has race conditions
我同时使用 angular 和 firebase,我有一个存储在我的根范围中的产品数组,尽管加载这些项目需要时间。
我的问题是,当我直接转到此页面时:
http://localhost/product/greyish-sports-shoes
如果我转到主页,产品会在 2 秒后加载.. 然后只有当我点击产品时 link 它才会带我到它,它会工作,因为产品已经已加载。
它转到包含 products 数组的 shoeService,但仍未加载项目,因此它无法通过 slug 找到产品。
这是我在 运行 方法中使用的代码。
var ref = firebase.database().ref().child('products');
$rootScope.shopProds = $firebaseArray(ref);
我的鞋厂:
function shoeFactory($rootScope) {
this.service = {};
this.service.store = new Store($rootScope.shopProds);
this.service.cart = new Cart();
return this.service;
}
重要的是要认识到 $firebaseArray
服务 returns 一个最初为空的数组。在从服务器返回数据后异步填充数组。
使用附加到数组的 $loaded
方法返回的承诺:
function shoeFactory($rootScope) {
this.service = {};
this.service.storePromise = $rootScope.shopProds.$loaded()
.then ( (shopProds) => {
return new Store(shopProds);
});
this.service.cartPromise = this.service.storePromise
.then ( () => {
return new Cart();
}).catch( (error) => {
console.log("ERROR in shoeFactory");
throw error;
});
return this.service;
}
为避免竞争条件,代码需要使用 promise 来链式操作。
我同时使用 angular 和 firebase,我有一个存储在我的根范围中的产品数组,尽管加载这些项目需要时间。
我的问题是,当我直接转到此页面时: http://localhost/product/greyish-sports-shoes
如果我转到主页,产品会在 2 秒后加载.. 然后只有当我点击产品时 link 它才会带我到它,它会工作,因为产品已经已加载。
它转到包含 products 数组的 shoeService,但仍未加载项目,因此它无法通过 slug 找到产品。
这是我在 运行 方法中使用的代码。
var ref = firebase.database().ref().child('products');
$rootScope.shopProds = $firebaseArray(ref);
我的鞋厂:
function shoeFactory($rootScope) {
this.service = {};
this.service.store = new Store($rootScope.shopProds);
this.service.cart = new Cart();
return this.service;
}
重要的是要认识到 $firebaseArray
服务 returns 一个最初为空的数组。在从服务器返回数据后异步填充数组。
使用附加到数组的 $loaded
方法返回的承诺:
function shoeFactory($rootScope) {
this.service = {};
this.service.storePromise = $rootScope.shopProds.$loaded()
.then ( (shopProds) => {
return new Store(shopProds);
});
this.service.cartPromise = this.service.storePromise
.then ( () => {
return new Cart();
}).catch( (error) => {
console.log("ERROR in shoeFactory");
throw error;
});
return this.service;
}
为避免竞争条件,代码需要使用 promise 来链式操作。