2016-09-16 14 views
0

Ich habe Probleme mit verzögerten Versprechen. Ich habe eine sehr hässliche Zeichenfolge:Verzögerte Versprechen in Funktion verzögert nicht die Ausführung der Funktion

Ich, Firmenname, SSQ ID, das Unternehmen, für das Sie arbeiten (Extraction/XTR/8North) und die Ebene, die Ihrem Unternehmen in Frage Nr. 17 zugeordnet ist.

| Y132 ~
| Y133 ~

| Y134 ~

| Y138 ~
| Y139 ~
| Y140 ~

| Y141 ~
| Y142 ~
| Y143 ~

dass ich jedes Vorkommen eines "| Y000 ~" w ersetzen muss mit einem URL-Link. Dieser Teil des Codes funktioniert ordnungsgemäß. Das Problem ist, dass ich nicht herausfinden kann, wie man ein Versprechen verwendet, um auf die Funktion zu warten (die die Verzögerung mehrerer Versprechen beinhaltet), um zu warten, bis die Funktion beendet ist, bevor ich weitermache.

Ich habe dies in meiner "convertString" -Funktion:

getAllClusterLinks(indices, returnString) 
returnString = $scope.returnString; 

Hier ist die convetString Funktion:

function convertClusterText(questions, field) { 
    angular.forEach(questions, function (value, key) { 
     if (value.vchTextBeforeQuestionCluster != null) { 
      var str = value.vchTextBeforeQuestionCluster; 
      var returnString = str.replaceAll('|B', '<b>'); 
      returnString = returnString.replaceAll("|b", "</b>"); 
      returnString = returnString.replaceAll("|+", "<br/>"); 
      returnString = returnString.replaceAll("|L", "<"); 
      returnString = returnString.replaceAll("|R", ">"); 
      returnString = returnString.replaceAll("|T", "<table border='1'>"); 
      returnString = returnString.replaceAll("|/T", "</table>"); 
      returnString = returnString.replaceAll("|S", "<tr>"); 
      returnString = returnString.replaceAll("|/S", "</tr>"); 
      returnString = returnString.replaceAll("|C", "<td>"); 
      returnString = returnString.replaceAll("|/C", "</td>"); 
      returnString = returnString.replaceAll("|A", "&#39;"); 
      returnString = returnString.replaceAll("|Q", "&amp;"); 
      returnString = returnString.replaceAll("|P", "&#59;"); 
      returnString = returnString.replaceAll("|W", "&#34;"); 
      returnString = returnString.replaceAll("|H", "<hr style='width: 100%;'>"); 
      returnString = returnString.replaceAll("|U", "<span style='text-decoration:underline'>"); 
      returnString = returnString.replaceAll("|x", "</span>"); 
      returnString = returnString.replaceAll("|N", "<span style='color:black'>"); 
      returnString = returnString.replaceAll("|D", "<span style='color:blue'>"); 
      returnString = returnString.replaceAll("|E", "<span style='color:red'>"); 
      returnString = returnString.replaceAll("|G", "<span style='color:gray'>"); 
      if (returnString.indexOf("|Y") >= 0) { 
       var indices = []; 
       var linkCode; 

       indices = getIndicesOf("|Y", returnString, true); 

       if (indices.length > 1) { 

        getAllClusterLinks(indices, returnString) 
        .then(function() { 
         returnString = $scope.returnString; 

        }) 
          value.vchTextBeforeQuestionCluster = returnString; 



       } 
       else { 
        linkCode = getLink(returnString); 
        contractorService.gethyperlink(linkCode) 
        .success(function (data) { 
         var vchUrl = data[0].vchUrl; 
         var docID = getDocumentID(vchUrl); 
         var vchLinkName = data[0].vchLinkName; 
         questions[key].document = docID; 
         var yay = '<a href="" ng-click="getDocument(cluster)">' + vchLinkName + '</a>'; 
         var yCode = "|Y" + linkCode + "~"; 
         returnString = returnString.replaceAll(yCode, yay); 
         value.vchTextBeforeQuestionCluster = returnString; 
        }) 
       } 

      } 
      else { 
       value.vchTextBeforeQuestionCluster = returnString; 

      } 


     } 
    }); 
}; 

I "getAllClusterLinks" ausfüllen müssen, bevor die nächste Zeile ausgeführt wird. Hier ist der Code für „getAllClusterLinks“:

function getAllClusterLinks(indices, returnString) { 
    var promises = []; 
    var times = 0 
    var endIndex = 0; 
    angular.forEach(indices, function (value, key) { 
     endIndex = getEndIndicesOf("~", returnString, value); 
     linkCode = getMultiLinks(returnString, value, endIndex) 
     var promise = getClusterLinks(linkCode, returnString); 
     promises.push(promise); 
    }) 

    return $q.all(promises); 
} 
function getClusterLinks(linkCode, returnString) { 
    var deferred = $q.defer(); 
    $scope.returnString = returnString; 
    contractorService.gethyperlink(linkCode) 
    .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="getDocument(' + docID + ')">' + vchLinkName + '</a>'; 
     var yCode = "|Y" + linkCode + "~"; 
     $scope.returnString = $scope.returnString.replaceAll(yCode, yay); 
    }) 
    return deferred.promise; 

} 

Der obige Code funktioniert wie erwartet, aber ich muss es zuerst beenden, bevor die Linie returnString = $scope.returnString; Einstellung.

versucht, dieses aber es funktioniert nicht:

     getAllClusterLinks(indices, returnString) 
        .then(function() { 
         returnString = $scope.returnString; 

        }) 

Jede Hilfe wird sehr geschätzt!

+0

Sie setzen '$ scope.returnString = returnString;' innerhalb der Funktion zu. Erklären Sie ausführlicher, wie dies funktionieren soll.Ich denke, Sie wollen die Zeichenfolge jedes Mal zurückgegeben, aber es ist nicht klar, welches Ziel ist – charlietfl

Antwort

1

$ q.all (Versprechen) ein Versprechen. Sie sollten dann() verwenden können.

getAllClusterLinks(indices, returnString).then(function() { 
    returnString = $scope.returnString; 
}); 

[https://docs.angularjs.org/api/ng/service/ $ q] [1]

EDIT: Sie sollten Ihre latente Objekt

Nebenbei bemerkt lösen: Ich glaube, Erfolg() ist bereits veraltet, sollten Sie verwenden .then

function getClusterLinks(linkCode, returnString) { 
    var deferred = $q.defer(); 
    $scope.returnString = returnString; 
    contractorService.gethyperlink(linkCode) 
    .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="getDocument(' + docID + ')">' + vchLinkName + '</a>'; 
     var yCode = "|Y" + linkCode + "~"; 
     $scope.returnString = $scope.returnString.replaceAll(yCode, yay); 
     deferred.resolve(); // resolve here 
    }) 
    return deferred.promise; 

} 
+0

Leider habe ich das versucht und die "dann" nie getroffen wird. –

+0

Sie lösen Ihr verzögertes Objekt nicht auf. Siehe meine aktualisierte Antwort – doge1ord

+0

Danke! Hinzufügen von deferred.resolve(); erledigt! Tausend Dank! –

0

Versuchen Sie, die nachfolgende Zeile in einem dann() Rückruf setzen:

getAllClusterLinks(indices, returnString) 
    .then(function() { 
     returnString = $scope.returnString; 
    }); 

Für weitere Informationen über Zusagen im Winkel, kehrt siehe the documentation

Verwandte Themen