Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS工厂函数在初始执行时直接捕捉块_Javascript_Node.js_Angularjs_Promise - Fatal编程技术网

Javascript AngularJS工厂函数在初始执行时直接捕捉块

Javascript AngularJS工厂函数在初始执行时直接捕捉块,javascript,node.js,angularjs,promise,Javascript,Node.js,Angularjs,Promise,我试图从数据服务调用一个函数,从数据库返回一个值 问题是,从调试中我可以看出,当函数第一次被调用时,promise的.then块似乎一开始就被跳过了,它直接跳到catch块 然后加载视图,初始值为dataService.Favorites,它是一个空数组,与GetFavorites函数返回的更新值相反,然后该函数执行。然后阻塞并从数据库中获取数据,但现在为时已晚,因为控制器已经用出厂时的原始空数组进行了初始化 node.js函数调用数据库 app.get('/user/getFavourites

我试图从数据服务调用一个函数,从数据库返回一个值

问题是,从调试中我可以看出,当函数第一次被调用时,promise的.then块似乎一开始就被跳过了,它直接跳到catch块

然后加载视图,初始值为dataService.Favorites,它是一个空数组,与GetFavorites函数返回的更新值相反,然后该函数执行。然后阻塞并从数据库中获取数据,但现在为时已晚,因为控制器已经用出厂时的原始空数组进行了初始化

node.js函数调用数据库

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失败”,错误);
})
}