承诺链接

时间:2016-03-30 18:26:45

标签: angularjs promise angular-promise

您好我正在尝试实现Promise Chaining在我的角度项目中使用q-library是我的2种方法以及它们被链接的方式。我还发布了方法实现来理解我的问题。现在在pathUserDataFromAuthService方法中,我想访问我在第一个Promise中设置的Etag值,即getUserDataFromAuthServer使用setEtag()方法,这里的问题是调用getEtag()方法在第一个承诺数据解决之前。

如何确保正确的Etag值出现

在这方面的任何帮助都会很棒

  getUserDataFromAuthServer(user)
            .then(pathUserDataFromAuthService(user))

,方法代码如下

    getUserDataFromAuthServer = function(user){
                    var defer=$q.defer();
                    $http.get(autherizationURL+'/'+'api/users/'+user.username)
                   .then(function(response){
                        var ETag =response.headers().etag;
                        console.log("etag"+ETag)
                        setEtag(ETag)
                        console.log("Etag Set changed");
                        defer.resolve(response.data);
                    },function(error){          
                          defer.reject(error.statusText);
                    });
                    return defer.promise;       
                };



            var pathUserDataFromAuthService = function (user){      
                var defer=$q.defer();
                var passwordtobesaved ={
                        "firstName": user.firstName,
                        "lastName": user.lastName
                    };
                var tag = getEtag();
            $http.put(autherizationURL+'/'+'api/users/'+user.username,passwordtobesaved,{
                    headers:{
                        "If-Match": tag
                    }
                }).then(function(response){

                    defer.resolve(response.data);
                },function(error){          
                      defer.reject(error.statusText);
                });
                return defer.promise;       
            };

2 个答案:

答案 0 :(得分:1)

无需使用延迟,这是一种反模式。 您可以通过返回http请求来传递承诺。

这是应该如何:

getUserDataFromAuthServer = function(user){
  return $http.get(autherizationURL+'/'+'api/users/'+user.username)
      .then(function(response){
           var ETag =response.headers().etag;
           console.log("etag"+ETag)
           setEtag(ETag)
           console.log("Etag Set changed");
           return response.data;
        }
};

同样的事情可以在你的第二个函数中完成,虽然我不明白为什么它需要它,因为它在它结束时什么都不做。

var pathUserDataFromAuthService = function (user){      
  var passwordtobesaved ={
    "firstName": user.firstName,
    "lastName": user.lastName
  };
  var tag = getEtag();
  return $http.put(
    autherizationURL + '/' + 'api/users/' + user.username, 
    passwordtobesaved, 
    { headers: { "If-Match": tag } }
  )
};

答案 1 :(得分:0)

正如已经指出的那样,主要问题是then()接受功能

之后,需要通过user会让事情变得有点尴尬,但javascript无法应对。

有许多方法可行。这是两个。

<强> 1。借助user

分别通过etag.bind()

这可能并不明显,因为两个参数useretag通过不同的机制传递:

  • user:是“绑定”
  • etag:由promise链传递给.bind()
  • 返回的函数
getUserDataFromAuthServer(user).then(pathUserDataFromAuthService.bind(null, user));

getUserDataFromAuthServer = function(user) {
    return $http.get(autherizationURL + '/api/users/' + user.username).then(function(response) {
        return response.headers().etag;
    });
};

var pathUserDataFromAuthService = function(user, etag) {
    return $http.put(autherizationURL + '/api/users/' + user.username, {
        "firstName": user.firstName,
        "lastName": user.lastName
    }, {
        headers: { "If-Match": etag }
    }).then(function(response) {
        return response.data;
    });
};

<强> 2。将useretag作为单个对象的属性提供

这可能更直观。承诺链将pathUserDataFromAuthService作为data传递给单个对象。

getUserDataFromAuthServer(user).then(pathUserDataFromAuthService);

getUserDataFromAuthServer = function(user) {
    return $http.get(autherizationURL + '/api/users/' + user.username).then(function(response) {
        return {
            user: user,
            etag: response.headers().etag
        };
    });
};

var pathUserDataFromAuthService = function(data) {
    return $http.put(autherizationURL + '/api/users/' + data.user.username, {
        "firstName": data.user.firstName,
        "lastName": data.user.lastName
    }, {
        headers: { "If-Match": data.etag }
    }).then(function(response) {
        return response.data;
    });
};

在两个解决方案中,setEtag() / getEtag()假设它们(在问题中)仅作为传递ETag的机制而消失。如果由于其他原因(例如副作用)需要,可以重新引入它们而不会产生任何后果(除非它们抛出)。