AngularJs承诺"然后"在承诺解决之前开火

时间:2016-10-13 13:04:58

标签: javascript angularjs recursion

我在递归函数上遇到链式承诺问题。我的递归函数类似于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上设置超时但我仍然得到相同的重复,它只需要更长的时间。非常感谢任何帮助!

1 个答案:

答案 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;
};