Javascript AngularJS工厂函数在初始执行时直接捕捉块
我试图从数据服务调用一个函数,从数据库返回一个值 问题是,从调试中我可以看出,当函数第一次被调用时,promise的.then块似乎一开始就被跳过了,它直接跳到catch块 然后加载视图,初始值为dataService.Favorites,它是一个空数组,与GetFavorites函数返回的更新值相反,然后该函数执行。然后阻塞并从数据库中获取数据,但现在为时已晚,因为控制器已经用出厂时的原始空数组进行了初始化 node.js函数调用数据库Javascript AngularJS工厂函数在初始执行时直接捕捉块,javascript,node.js,angularjs,promise,Javascript,Node.js,Angularjs,Promise,我试图从数据服务调用一个函数,从数据库返回一个值 问题是,从调试中我可以看出,当函数第一次被调用时,promise的.then块似乎一开始就被跳过了,它直接跳到catch块 然后加载视图,初始值为dataService.Favorites,它是一个空数组,与GetFavorites函数返回的更新值相反,然后该函数执行。然后阻塞并从数据库中获取数据,但现在为时已晚,因为控制器已经用出厂时的原始空数组进行了初始化 node.js函数调用数据库 app.get('/user/getFavourites
app.get('/user/getFavourites', function (req, res) {
User.find({ username: req.session.passport.user }, 'favourites', function (err, docs) {
if (err) {
res.status(400).send("Couldn't get favourites")
} else {
res.status(200).send(docs);
}
})
.lean();
})
angularJS工厂中的函数
getFavourites: function () {
$http.get('/user/getFavourites')
.then(function (response) {
return $http.get('/user/getFavourites')
})
.then(function (response) {
this.favourites = [...response.data[0].favourites];
return this.favourites;
})
.catch(function (response) {
console.log(response);
})
}
})
我调用函数的控制器
dataService.getFavourites();
console.log(dataService.favourites);
最后一个观点是
<div class="col-sm-5 col-lg-2 cocktailResultsContainer" ng-repeat="favourite in dataService.favourites">
<button class="btn deleteFavouriteButton" ng-click="deleteFavourite()"><i
class="fas fa-times fa-3x"></i></button>
<a href="#!CocktailDetails" ng-click="selectedCocktail($index)">
<h3 class="text-center cocktailHeader"><strong>{{favourite.cocktailName}}</strong></h3>
<img ng-src="{{favourite.cocktailImage}}" alt="Cocktail image" class="cocktailImageSearchResult">
</a>
</div>
我做错了什么?本质上,我的目标是在加载视图之前获取dataService.Favorites的更新值
我已经阅读了一些关于AngularJS承诺的文档,但是我觉得我还没有完全理解这个概念
谢谢我认为您的目标是“在加载视图之前获取dataService.Favorites的更新值”,这是可能的,但不是您尝试的方式 首先,您需要了解dataService.GetFavorities会立即返回1)nothing和2)nothing。如果您想要
console.log(dataService.favorites)代码>在它完成请求/user/getfavorite之后,您需要等待它完成。你可以通过回复承诺来做到这一点。对于第一个then块,您还将进行第二次请求。应该是这样的
getFavorites:函数(){
返回$http.get('/user/getFavorites')
.然后(功能(响应){
this.favorites=[…response.data[0]。favorites];
返回此。收藏;
})
.catch(函数(错误){
console.log(“请求/user/getfavorities失败”,错误);
})
}