2016-10-13 3 views
0

У меня проблема с прикованными обещаниями по рекурсивной функции. Моя рекурсивная функция похожа на ответ, найденный здесь на Stack Overflow по аналогичной проблеме. Проблема заключается в том, что вызов функции обещания является угловым. Для каждого. Первый возвращает отлично, однако, когда второй запускается, «тогда» попадает, но ответ по-прежнему удерживает значение для предыдущего обещания, поэтому я получаю одни и те же данные дважды. К тому времени, когда второе обещание будет разрешено, слишком поздно, и страница уже отображена с дублирующейся информацией.AngularJs Promise «Then» Пожары перед обещанием разрешены

Вот мое обещание функции:

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

Вы забыли ',' после 'вар обещание = 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

Большое вам спасибо !!!! Это исправило это! –

Смежные вопросы