正当我以为我已经实现了 promise 时,我再次陷入困境。我正在尝试使用递归函数来返回 promise 。看起来它正在工作,但“然后”部分永远不会被击中。我尝试使用 $q.all
但这导致我多次调用 Web API 时出现问题。重写代码以使用递归似乎是答案,但我无法让“然后”执行。我认为我一定错过了一些简单的东西,但我似乎无法弄清楚到底是什么。
这是对该函数的调用:
getClusterLink(linkcodes, returnString)
.then(function () {
value.vchTextBeforeQuestionCluster = $scope.returnString;
})
这是递归函数:
function getClusterLink(linkcodes, returnString) {
var deferred = $q.defer();
$scope.returnString = returnString;
if (linkcount < linkcodes.length) {
contractorService.gethyperlink(linkcodes[linkcount])
.success(function (data) {
var vchUrl = data[0].vchUrl;
var end = vchUrl.length;
var docID = vchUrl.substring(vchUrl.indexOf("=") + 1, end);
var vchLinkName = data[0].vchLinkName;
var yay = '<a href="" ng-click="getDocumentByID(' + docID + ')">' + vchLinkName + '</a>';
var yCode = "|Y" + linkcodes[linkcount] + "~";
$scope.returnString = $scope.returnString.replaceAll(yCode, yay);
linkcount++;
return getClusterLink(linkcodes, $scope.returnString);
})
}
else {
deferred.resolve();
return deferred.promise;
}
};
该函数本身工作正常。它命中了 resolve
和 return deferred.promise
,但“then”永远不会触发。
非常感谢任何帮助!
最佳答案
在解析或拒绝它之前,函数必须返回 Promise。
function getClusterLink(linkcodes, returnString) {
var deferred = $q.defer();
$scope.returnString = returnString;
if (linkcount < linkcodes.length) {
contractorService.gethyperlink(linkcodes[linkcount])
.success(function (data) {
var vchUrl = data[0].vchUrl;
var end = vchUrl.length;
var docID = vchUrl.substring(vchUrl.indexOf("=") + 1, end);
var vchLinkName = data[0].vchLinkName;
var yay = '<a href="" ng-click="getDocumentByID(' + docID + ')">' + vchLinkName + '</a>';
var yCode = "|Y" + linkcodes[linkcount] + "~";
$scope.returnString = $scope.returnString.replaceAll(yCode, yay);
linkcount++;
})
return getClusterLink(linkcodes, $scope.returnString);
}
else {
deferred.resolve();
}
return deferred.promise;
};
.then 在 Promise 对象上实现。因此,当函数返回 Promise 时,.then 就可以正常工作。
您可以查看此示例 https://jsbin.com/daseyu/edit?html,js,console,output 效果很好。
我认为问题是因为您成功返回了 getClusterLink。您可以在 if 循环末尾返回,而不是在 .success 中返回。
希望这有帮助。
关于javascript - Angular then 不会触发递归函数上的 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39623663/