在角度

时间:2016-06-02 08:57:40

标签: javascript angularjs node.js http asynchronous

我的Node后端有以下终点:

usersRoute.get('/get', function(req, res) {

    //If no date was passed in - just use todays date

    var date    = req.query.date || dateFormat(new Date(), 'yyyy-mm-dd'),
        search  = req.query.search;

    users.getAllUsers(date, search)
        .then(function(results) {
           res.json(results); 
        }, function(err) {
            res.status(500).json({
                success: false, 
                message: 'Server error.',
                data: []
            });
        });
});

我已将我的sql表名更改为其他名称以触发function(err){}部分

当我在我的服务中使用它时,它看起来像这样:

function getUsers(date, search) {
            return $http.get('/api/users/get', {
                params: {
                    date: UtilsService.formatDate(date),
                    search: search
                }
            })
            .then(getData)
            .catch(handleErr);

            function getData(response) {
                return response.data;
            }

            function handleErr(err) {
                LoggerService.error('Could not retrieve users.', err ,'Ooops');
            }
        }

知道服务器将返回http status code 500,我认为它会直接进入catch block。但它也返回undefined

中的数据/ then block

我在我的控制器中使用我的服务:

function getUsers(date, search) {
            isAdmin();

            vm.loading = true;
            vm.filteredUsers = [];

            return UsersService.getUsers(date, search).then(function(data) {
                vm.loading = false;

                allUsers = data || [];
                vm.filteredUsers = allUsers.slice(0, 50);
                vm.distribution = UsersService.getDistribution(allUsers);

                return vm.filteredUsers;
            });
        }

我的问题是,因为我的then已触发service部分。我正在尝试切片undefined

我的问题是:当谈到这种模式时,最佳做法是什么。

2 个答案:

答案 0 :(得分:2)

问题是您从API中捕获错误,然后返回.catch创建的承诺。

快速示例

promise.then(function(data) {
  throw 'Some error';
}).catch(function (err) {
  console.log(err) // will output 'Some error'
}).then(function () {
  // This will run even though we have a catch before
});

那么我们怎样才能阻止 .then 我们很容易在.catch

中抛出错误
promise.then(function(data) {
  throw 'Some error';
}).catch(function (err) {
  console.log(err) // will output 'Some error'
  throw 'You shall not pass'
}).then(function () {
  // This will not run
});

因此,在您的情况下,您有两个选项,一个抛出错误,或者两个将$q服务注入您的服务:

function getUsers(date, search) {
    return $http.get('/api/users/get', {
        params: {
            date: UtilsService.formatDate(date),
            search: search
        }
    })
    .then(getData)
    .catch(handleErr);

    function getData(response) {
        return response.data;
    }

    function handleErr(err) {
        LoggerService.error('Could not retrieve users.', err ,'Ooops');
        return $q.reject(err);
    }
}

答案 1 :(得分:0)

你可以做那样的事情

function getUsers(date, search, cb) {
      return $http.get('/api/users/get', {
           params: {
                date: UtilsService.formatDate(date),
                search: search
           }
      })
      .then(cb)
      .catch(handleErr);

      function handleErr(err) {
           LoggerService.error('Could not retrieve users.', err ,'Ooops');
      }
}

然后在你的控制器中

 UsersService.getUsers(date, search, function(data) {
        vm.loading = false;

        allUsers = data || [];
        vm.filteredUsers = allUsers.slice(0, 50);
        vm.distribution = UsersService.getDistribution(allUsers);
  });