我有以下服务,
.service('indexDBService', function ($indexedDB, firebaseService) {
var objects = [];
var addToVideos = [];
var _this = this;
firebaseService.getvideosApi().then(function(response){
_this.videos = response.data;
var userVideos = _this.videos;
for (var key in userVideos) {
if (userVideos.hasOwnProperty(key)) {
var video = {"file_id": userVideos[key].file_id, "filename": userVideos[key].filename, "file_status": userVideos[key].file_status, "user_id": userVideos[key].user_id, "video_avatar": userVideos[key].video_avatar, "upload_date": userVideos[key].upload_date, "file_dislikes": userVideos[key].file_dislikes, "file_likes": userVideos[key].file_likes, "downloadUrl": userVideos[key].downloadUrl}
addToVideos.push(video);
}
}
if((objects.length) < (Object.keys(_this.videos).length)){
$indexedDB.openStore('userVideos', function(store){
store.upsert(addToVideos).then(function(e){
// do something
});
});
}
});
//get indexDB Videos
$indexedDB.openStore('userVideos', function(store){
store.getAll().then(function(userVideos) {
objects = userVideos;
_this.vObjects = objects;
});
});
});
我想在控制器中获取vObject,以便我可以在那里使用。如何将_this.vObjects返回或传递给我的控制器?
答案 0 :(得分:1)
由于这是一个角度服务,你应该使用promises。 Promises允许您访问异步数据,您正在使用firebase和inddxdb服务。我将假设您正在使用_this.vobject来缓存服务中的数据,因此您不需要每次都发出请求。我会像你这样为你的服务注入$ q
. service('indexDBService',function($indexedDB, firebaseService,$q)
$ q是一个允许您构建承诺的API。在角度服务中,您通过将方法添加到此方法来公开方法。为了创建一个获取数据的方法,你可以像这样构建它。
this.getVobj = function(){
var deferred = $q.defer()
if(_this.vObjects){
deferred.resolve(_this.vObjects);
} else {
$indexedDB.openStore('userVideos', function(store){
store.getAll().then(function(userVideos) {
objects = userVideos;
_this.vObjects = objects;
deferred.resolve(objects);
});
});
}
return deferred.promise;
};
然后在您的控制器中获取它,您将注入您的服务。
myModule.controller('myCtrl', function(indexDBService){
indexDBService.getVobj().then(function(vObj){
//Do stuff with vobj
});
});