然后(函数)没有得到angularjs中返回的promise值的更新

时间:2015-09-11 03:42:29

标签: javascript jquery angularjs

我试图在angularjs的promises帮助下从API获取一些数据。我有一个服务从API获取值并将promise返回给控制器。

***Service***
this.forgotPasswordLink = function(email){
    var deferred = $q.defer();
    $http.post('/forgotPassword',{
        email: email 
    }).success(function(response){
        console.log("the new response is: ",response);
        deferred.resolve(response);
    }).error(function(error){
        deferred.reject(error);
    });
    return deferred.promise;
};

**Controller**
authService.forgotPasswordLink($scope.forgotPasswordEmail).then(function(data){
        console.log(data);
        if(data.message === 'emailFound'){
            $scope.emailSent = true;
            $scope.emailNotSent = false;
        }
        else{
            $scope.emailNotSent = true;
            $scope.emailSent = false;
        }
    });

此处authservice是服务的名称。所以这段代码工作正常,但问题是当我尝试一个接一个地多次获取数据时,第一次承诺返回正确的数据但是当我尝试发布不同的数据时,承诺没有更新即使承诺从服务器得到适当的响应,那么(函数)。

如果你看到有两个控制台语句,一个在服务中,一个在控制器中;所以控制器中的控制台语句首先执行,因为promise返回旧值,当promise正在解析时,使用更新后的值执行服务中的第二个控制台语句。

那么如何在(函数)中获取更新值。发布数据一次后,是否需要刷新服务。

2 个答案:

答案 0 :(得分:0)

正如@Terry建议的那样,你根本不需要依赖$ q来实现结果。我推荐以下两种方法之一:

<强>#1:

***Service***
this.forgotPasswordLink = function(email){
    return $http.post('/forgotPassword',{
        email: email 
    }).then(function(response){
        console.log("the new response is: ",response);
        return response;
    }).catch(function(error){
        return error;
    });
};

在这种情况下,控制器保持不变;唯一需要注意的是,即使在错误的情况下,也会调用控制器的函数,data是从catch服务块返回的错误对象。

<强>#2:

***Service***
this.forgotPasswordLink = function(email){
    return $http.post('/forgotPassword',{
        email: email 
    });
};

***Controller***
authService.forgotPasswordLink().then(function(data){
    console.log(data);
    if(data.message === 'emailFound'){
        $scope.emailSent = true;
        $scope.emailNotSent = false;
    }
    else{
        $scope.emailNotSent = true;
        $scope.emailSent = false;
    }
}).catch(function(error){
    console.log(error); // Error handling like notifying user, etc...
});

在第二种方法中,服务只返回$http返回的承诺。然后控制器根据此承诺的结果采取行动。

有人可能会争辩说服务是获取数据并将其交给控制者采取行动的责任。这是第一种方法。

我个人更喜欢第一种方法,因为服务很简单,而且很容易以这种方式进行测试。

答案 1 :(得分:-1)

当你使用then方法时,你已经将.data放在你的变量data.data。

之后