【问题标题】:$http returns promise instead data$http 返回承诺而不是数据
【发布时间】:2015-01-28 16:39:55
【问题描述】:

我昨天开始使用 AngularJS,所以我确定我在这个问题上非常愚蠢,但我们开始吧。

这是我的服务。

angular.module('UserService', ['ngResource'])
    .factory('User', ['$resource', '$http', function($resource, $http){

    User = {};
    User.login = function (){
        var url = 'http://example.com/api/user/login';
        loginInfo = $http({
            method: 'POST',
            url: url,
            data: "user=user&pass=imagethereisahugepasshere",
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        }).success(function(data){
            loginInfo = data;
        })
        return loginInfo;
    }


    return User;


}])

如果我将它附加到我的控制器并调用 console.log(User.login()),它会返回我的承诺而不是响应(这是正确的,根据网络 Chrome 选项卡)。

我做错了什么?

【问题讨论】:

标签: angularjs angularjs-service


【解决方案1】:

因为是异步请求,所以函数返回时还没有完成。这就是为什么您有一个成功回调来执行请求实际完成时需要执行的任何操作。

取回一个承诺允许您以不同的方式处理它 - 您可以在承诺完成后使用 .then() 做一些事情。但重要的是要知道该函数将在获取数据之前返回。

【讨论】:

  • 好的。那你有什么建议?我想我需要另想办法,但我不知道该怎么做。
  • 简单的答案就是在成功回调中做你需要做的事情,或者使用promise:loginInfo.then(function(data) {//dostuffhere});。重要的是要记住您的代码不会总是直接通过 - 函数将在返回数据时被调用。因此,在构建代码时应该牢记这一点。 Angulars 数据绑定有很大帮助,因为它为您处理了很多事情。
  • 我做到了,而且成功了。现在我必须想办法将它整合到我脑海中的流程中。谢谢。
【解决方案2】:

在您的代码中:-

 return--> loginInfo =$http({
                method: 'POST',
                url: url,
                data: "user=user&pass=imagethereisahugepasshere",
                headers: {'Content-Type': 'application/x-www-form-urlencoded'}
            }).success(function(data){
                loginInfo = data;<-- doesn't come into picture
            })
    return loginInfo;<--$http service promise rather than local data variable

显然 loginInfo 是一个 $http 服务承诺。

【讨论】:

    猜你喜欢
    • 2021-01-13
    • 2015-05-18
    • 1970-01-01
    • 2016-02-21
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多