您好我正在尝试实现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;
};
答案 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()
这可能并不明显,因为两个参数user
和etag
通过不同的机制传递:
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。将user
和etag
作为单个对象的属性提供
这可能更直观。承诺链将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
的机制而消失。如果由于其他原因(例如副作用)需要,可以重新引入它们而不会产生任何后果(除非它们抛出)。