2016-10-13 26 views
0

我在递归函数中遇到链接承诺问题。我的递归函数与Stack Overflow上的类似问题的答案类似。问题是对promise函数的调用是angular.forEach。第一个返回完美,但是当第二个运行时,“then”会被击中,但响应仍然保留前一个promise的值,所以我得到相同的数据两次。到第二个承诺解决的时候,已经太晚了,并且页面已经呈现了重复信息。AngularJs承诺“然后”在承诺解决之前触发

这里是我的诺言功能:

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

你忘了','后'VAR承诺= getClusterLink(linkcodes,returnString)' – Weedoze

+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; 
}; 
+0

非常感谢你!这解决了它! –