2017-12-30 40 views
1

Ich habe asynchrone rekursive Funktion und das dauert einige Zeit zur Ausführung.Rückgabeversprechen von Rekursive Funktion in Ionic 2/Typ Skript/Angular 2

Siehe folgenden zwei Funktionen

public sendAndRecivesMessage(content:string, finalMessage:Message, outMessageCount:number = 1){ 
     this.promise = new Promise((resolve, reject) => { 
      this.doSendAndRecivesMessage(content, finalMessage, outMessageCount); 
      console.log("Have to wait until above function finish executing"); 
      resolve (finalMessage); 
     }); 
     return this.promise; 
    } 

private doSendAndRecivesMessage(content:string, finalMessage:Message, outMessageCount:number = 1){ 

     let newContent = IREDMART_KEYWORD + APP_IDENTITY + outMessageCount + " " + content; 
     let message:Message = new Message(newContent, API_END_POINT); 

     this.sendMessage(message); 

     let promise = this.recieveMessage(); 
     promise.then((message) => { 
      let inMessageCount:number = message.content.split(MSG_COUNT_SEPARATOR)[1]; 
      finalMessage.content += message.content.split(MSG_COUNT_SEPARATOR)[2]; 
      if(inMessageCount == 1){ 
       finalMessage.reciever = message.reciever; 
       finalMessage.date = message.date; 
      } 
      else{ 
       this.sendAndRecivesMessage(content, finalMessage, outMessageCount + 1); 
      } 
     }); 
    } 

Hier doSendAndRecivesMessage Funktion dauert einige Zeit auszuführen, und es ist eine rekursive Funktion.

in sendAndRecivesMessage Funktion Ich muss warten, bis über Funktion seine Ausführung beendet und haben zurückzukehren finalMessage

Wie kann ich das erreichen?

Auch habe ich versucht, es wie folgt

public sendAndRecivesMessage(content:string, finalMessage:Message, outMessageCount:number = 1){ 

     let newContent = IREDMART_KEYWORD + APP_IDENTITY + outMessageCount + " " + content; 
     let message:Message = new Message(newContent, API_END_POINT); 

     this.promise = new Promise((resolve, reject) => { 
      this.sendMessage(message); 

      let promise = this.recieveMessage(); 
      promise.then((message) => { 
       let inMessageCount:number = message.content.split(MSG_COUNT_SEPARATOR)[1]; 
       finalMessage.content += message.content.split(MSG_COUNT_SEPARATOR)[2]; 
       if(inMessageCount == 1){ 
        finalMessage.reciever = message.reciever; 
        finalMessage.date = message.date; 
        resolve(finalMessage); 
       } 
       else{ 
        this.sendAndRecivesMessage(content, finalMessage, outMessageCount + 1); 
       } 
      }); 
     }); 

     return this.promise; 
    } 

Aber wegen der Funktion ist async und rekursiv die Rückkehr Versprechen enthält finalMessage nicht gelöst.

Bitte geben Sie mir einen Vorschlag, um dieses Problem zu lösen.

Dank

+0

gerade dies klar zu bekommen, wollen Sie fordern eine asynchrone Funktion zu halten, bis Sie eine bestimmte Antwort zu bekommen und dann etwas von dieser Meldung zurück ? – toskv

+0

Ja, wenn die Nachricht inMessageCount == 1, muss ich die finalMessage zurückgeben, Sonst muss Funktion selbst aufrufen, indem Wert von outMessageCount, Die Logik empfängt Nachrichten hat inMessageCount wie ..., 3,2,1. Ich muss alle Nachrichtenkörper concat, bis InMessageCount = 1 Nachricht erhält. Dann müssen Sie finalMessage zurückgeben. –

+1

Ich habe ein Beispiel hinzugefügt, vielleicht wird es helfen, herauszufinden, wie Sie Ihren Code strukturieren. Wenn nicht, lassen Sie es uns wissen, wir können tiefer gehen. :) – toskv

Antwort

1

Sie die ganze Sache als ein Zug denken kann (ein Versprechen, Zug) und die Funktionen, die Sie als Wagen in diesem Zug anrufen möchten. Alles, was Sie tun müssen, ist, sie in der richtigen Reihenfolge zu verbinden.

Es gibt zwei Möglichkeiten, Wagen mit dem Zug zu verbinden. Einer ist, indem Sie einen Rückruf an die Funktion eines Versprechens geben. Die zweite besteht darin, ein weiteres Versprechen in einem der Rückrufe zurückzugeben.

Hier ist ein Beispiel dafür, wie Sie Ihren Code strukturieren könnten:

function randomNumber() { 
    // a function that can later return a value 
    return Promise.resolve(Math.random()); 
} 

// recursive function, keeps calling itself until the condition is met 
function collectValues(until, previous) { 
    // call the async function return a promise 
    return randomNumber().then((value) => { 
     // when we get a number we check the condition 
     console.log(`prev:${previous} new:${value}`); 
     let result = previous + value; 
     if (result > until) { 
      // when satisfied just return the final message 
      return result; 
     } else { 
      // return the promise from the next recursive call with new params 
      return collectValues(until, result); 
     } 
    }); 
} 

collectValues(5, 0).then(console.log);