是否可以从AngularJS中的$ http.get的success方法返回一个值?

时间:2016-03-23 12:13:20

标签: javascript angularjs asynchronous promise angular-promise

我目前正在接受一些承诺的大脑融合。

给出以下代码:

$scope.getData = function(user) {

    return $http.post('/endpoint', "some post data", { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } })
        .success(function (response) {

            var myThing = { stuff: response.infoData };

            localStorageService.set('myData', { stuff: response.infoData });

            return myThing;
    });
};

是否从成功回调中返回 myThing 对象:

  • 作为$ scope.getData方法或
  • 的结果返回
  • 忽视并输给了无处?

据我所知:

  • 因为$ http.post是一个承诺,它以异步方式解析,然后运行成功方法
  • 当运行成功方法时,它会返回myThing对象,但这并不会神奇地替换整个$ http.post承诺本身

这是对的吗?是否有我遗漏的东西,在成功方法中返回对象有什么好处,还是返回多余的? (我很清楚这是代码可以改进,但我试图找出具体为什么有人写这个,或者如果它完全是一个错误)

1 个答案:

答案 0 :(得分:4)

通过success/error方法使用$http回调无法让您从中返回数据。承诺确实提供了这种能力。它目前的写作方式将会如实。像myThing一样,当前的实现不会返回(那里是多余的return语句)。

  

为什么有人会写这个,或者这完全是个错误?

实施此方法的人试图从中返回数据,但我不认为他是通过查看当前代码而成功的。

利用$http方法返回的承诺,这将使您能够通过异步调用形成承诺链。为此,您需要使用.then代替.success方法。

$scope.getData = function(user) {
    return $http.post('/endpoint', "some post data", { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } })
      .then(function (res) {
          var response = res.data;
          var myThing = { stuff: response.infoData };
          localStorageService.set('myData', { stuff: response.infoData });
          return myThing;
    });
};

如果你真的有兴趣通过调用getData方法来检索数据,那么你可以使用getData方法,你应该将.then函数放在它返回的promise上以链接它。

$scope.getData().then(function(thing){
    console.log(thing);
})
  

旁注 .success& error功能超过$http methods are deprecated