2017-12-30 70 views
1

私は非同期再帰関数を持っており、実行には時間がかかります。戻り値Ionic 2/Type Script/Angular 2の再帰関数からのプロミス

を参照してください。次の2つの関数

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

ここdoSendAndRecivesMessage機能は、実行に時間がかかり、それが再帰関数です。

私は上記の関数の実行が終了するまで待って、どのように私はこれを達成することができます finalMessage

を返すために持っている必要がありsendAndRecivesMessage機能で

また、私は

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

を次のようにそれを試みたが、理由は関数の戻り値の約束がfinalMessageを解決含まれていない非同期および再帰的です。

この問題を解決するにはどうすればよいですか。あなたは電車(約束電車)、あなたはその電車でワゴンとして呼び出したい関数として全体のことを考えることができ

おかげ

+0

を、あなたは、特定の応答を取得するまでの非同期関数を呼び出しておくと、そのメッセージから何かを返したいです? – toskv

+0

はい、メッセージinMessageCount == 1のときは、finalMessageを返す必要があります。それ以外の場合は、outMessageCountの値を増やして関数自体を呼び出す必要があります。 ロジックには、...、3,2,1のようなinMessageCountというメッセージがあります。 inMessageCount = 1のメッセージが受信されるまで、すべてのメッセージ本文を連結する必要があります。次に、finalMessageを返さなければなりません。 –

+1

私は、コードをどのように構造化するかを理解するのに役立つかもしれない例を追加しました。もし私が私たちがもっと深く行くことができることを知らせなければ。 :) – toskv

答えて

1

。正しい順序で接続するだけです。

列車にワゴンを接続する方法は2通りあります。 1つは、約束のthen機能へのコールバックを与えることです。もう1つは、コールバックの1つで別の約束を返すことです。ここで

はあなたのコード構造ができる方法の例です:ただ、これは明確に取得する

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