2016-09-21 2 views
0

Как раз тогда, когда я думал, что у меня есть обещания, я понял, что снова в тупике. Я пытаюсь использовать рекурсивную функцию для возврата обещания. Похоже, что он работает, но «затем» часть никогда не попадает. Я пытался использовать $q.all, но это вызывает у меня проблему с несколькими вызовами моего веб-API. Перезапись кода для использования рекурсии казалась ответом, но я не могу заставить «then» выполнить. Я полагаю, что мне нужно пропустить что-то простое, но я не могу понять, что именно.Угловая Тогда не срабатывает для Promise по рекурсивной функции

Вот вызов функции:

    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, но «тогда» никогда не срабатывает.

Любая помощь очень ценится!

+1

Вы ничего не возвращаете в первой ветви условного ... удивляетесь, что вы не получаете ошибку типа. –

+0

я. Я возвращаю функцию. –

+0

Только «возврат» я вижу в этой ветке * внутри обратного вызова * –

ответ

0

Я понял. Кажется, проблема заключалась в том, что у меня было var deferred = $q.defer() внутри рекурсивной функции, поэтому она сохраняла сброс переменной. Перемещение его за пределы функции (например, ниже) разрешило проблему, и теперь «то» срабатывает.

var thisdeferred = $q.defer(); 

function getClusterLink(linkcodes, 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 { 
     thisdeferred.resolve(); 
    } 
    return thisdeferred.promise; 

}; 
1

обещание должно быть возвращено функцией до разрешения или отклонения.

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 реализован на объекте с обещанием. Так как функция возвращает обещание, то будет работать нормально.

Вы можете посмотреть этот образец https://jsbin.com/daseyu/edit?html,js,console,output Он отлично работает.

Я думаю, проблема в том, что вы успешно возвращаете getClusterLink. Вы можете вернуться в конец цикла if, а не в .success.

Надеюсь, это поможет.

+0

Пробовал это первым. Это не сработает. Также, помещаясь за пределы оператора if, он продолжает возвращать обещание снова и снова, несмотря ни на что. –

+0

@RaniRadcliff Я обновил свой ответ. – vbharath

+0

Спасибо за вашу помощь. Я не проголосовал за ваш ответ. Это помогло мне. –

1

Функция getClusterLink не возвращает обещание в случае, когда вызывается contractorService.gethyperlink. Интересно, вы не получите от этого исключения. И даже если вы всегда возвращали deferred.promise, он не будет разрешен в этой ветке.

Но вы не должны использовать отложенные здесь. Just use $q.resolve, и цепь на $http обещает, что gethyperlink возвращается. Обратите внимание, что .success устарел и не имеет цепочки, как then делает - return ing от этого обратного вызова бессмысленно.

function getClusterLink(linkcodes, returnString) { 
    $scope.returnString = returnString; 
    if (linkcount < linkcodes.length) { 
     return contractorService.gethyperlink(linkcodes[linkcount]) 
//  ^^^^^^ 
     .then(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 { 
     return $q.resolve(); 
    } 
} 
Смежные вопросы