javascript - Angular then 不会触发递归函数上的 Promise

标签 javascript angularjs recursion

正当我以为我已经实现了 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;
    }
};

该函数本身工作正常。它命中了 resolvereturn 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/

相关文章:

Python递归RuntimeError

Javascript 无限循环和递归错误

javascript - IE 中的 jQuery append() 问题

javascript - 定义 Javascript/JQuery 函数

javascript - 从 javascript 打开 Bootstrap 模式对话框不起作用

angularjs - 如何使用 karma 和 mocha+chai 单元测试 angularjs 路由的解析?

javascript - 从表 td 中获取所有属性作为数组

javascript - JQUERY 在检查元素是否有多个 'td' 父元素后获取该元素

javascript - 为什么 $scope.someArray.push 不是传递给 $q.promise 上的 .then 的有效函数

javascript - 检查数组 A 的数组 B 排列