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

3

我现在对 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个回答

5
使用$http方法的成功/错误回调函数不会使您能够从中返回数据。然而,使用Promise可以提供这种能力。当前的实现方式看起来不会返回像myThing那样的内容(因为有多余的返回语句)。
“为什么有人会写出这样的代码,或者这完全是一个错误?”
实现此方法的人试图从中返回数据,但我认为从当前的代码来看他并没有成功。
利用$http方法返回的Promise可以形成异步调用的Promise链。为此,您需要使用.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函数进行链接。

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

注意:使用$http方法的.successerror函数已被弃用。


谢谢,但我想了解的是如果在success方法中调用return会发生什么具体情况。(在你的答案中的示例代码中,getData实际上会返回myThing吗?这是因为你使用了then而不是success吗?这是因为它是一个promise链而不是一个promise和回调函数吗?) - Henry C
1
@HenryC 我认为更新后的描述应该能够帮助你澄清答案。谢谢 :-) - Pankaj Parkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接