我在递归函数上遇到链式承诺问题。我的递归函数类似于Stack Overflow上关于类似问题的答案。问题是对promise函数的调用是一个angular.forEach。第一个完美地返回,但是当第二个运行时,"然后"被击中,但响应仍然保持前一个承诺的值,所以我得到两次相同的数据。到第二个承诺得到解决时,为时已晚,页面已经呈现了重复信息。
这是我的承诺功能:
angular.forEach(question, function(value,key){
var returnString = value.myString
var promise = getClusterLink(linkcodes, returnString)
promise.then(function (response) {
value.myString = response;
linkcount = 0;
})
})
我的递归函数:
var thisdeferred = $q.defer();
function getClusterLink(linkcodes, returnString) {
contractorService.gethyperlink(linkcodes[linkcount])
.success(function (data) {
var vchUrl = data[0].vchUrl;
var yCode = "|Y" + linkcodes[linkcount] + "~";
returnString = returnString.replaceAll(yCode, vchUrl);
linkcount++;
if (linkcount < linkcodes.length) {
return getClusterLink(linkcodes, returnString);
}
else {
thisdeferred.resolve(returnString);
}
})
return thisdeferred.promise;
};
我尝试在deferred.resolve上设置超时但我仍然得到相同的重复,它只需要更长的时间。非常感谢任何帮助!
答案 0 :(得分:0)
您只有一个延迟,并且它在函数外部创建,因此第二次运行该函数时,您的单个延迟已经解决。
由于它是递归的,你必须稍微改变一下
function getClusterLink(linkcodes, returnString) {
var thisdeferred = $q.defer();
(function recursive(linkcodes, returnString) {
contractorService.gethyperlink(linkcodes[linkcount]).success(function(data) {
var vchUrl = data[0].vchUrl;
var yCode = "|Y" + linkcodes[linkcount] + "~";
returnString = returnString.replaceAll(yCode, vchUrl);
linkcount++;
if (linkcount < linkcodes.length) {
return recursive(linkcodes, returnString);
} else {
return thisdeferred.resolve(returnString);
}
});
})(linkcodes, returnString);
return thisdeferred.promise;
};