2016-09-21 78 views
0

就在我以爲我已經承諾想通了,我又難住了。我正在嘗試使用遞歸函數來返回一個承諾。它看起來像在工作,但「那麼」部分永遠不會被擊中。我試過使用$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,但是「那麼」從未激發。

任何援助非常感謝!

+1

你不會在條件的第一個分支中返回任何東西...驚訝你沒有得到一個類型錯誤。 –

+0

我會的。我返回該功能。 –

+0

只有'返回'我看到在該分支*是在回調* –

回答

0

我想通了。似乎問題是我在遞歸函數內有var deferred = $q.defer(),所以它保持重置變量。將它移動到函數之外(如下所示)解決了問題,「then」現在會觸發。

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

。然後在promise對象上實現。所以隨着函數返回的承諾,。然後將正常工作。

你可以看一下這個樣本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(); 
    } 
}