2017-12-30 29 views
1

비동기식 재귀 함수가 있으며 실행하는 데 시간이 오래 걸립니다.Return Ionic 2/Type Script/Angular 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 기능을 실행하는 데 시간이 걸리며 재귀 함수이다. sendAndRecivesMessage에서

나는 위의 함수가 실행을 완료 할 때까지 기다린가 필요 기능은 finalMessage

가 어떻게 이것을 달성 할 수 돌아갑니다?

또한, 나는

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
당신은 기차 (약속 열차) 및 그 기차 마차로 호출 할 함수와 전체 것은 생각할 수

. 올바른 순서로 연결 만하면됩니다.

기차에 왜건을 연결하는 두 가지 방법이 있습니다. 하나는 약속의 then 기능에 대한 콜백을 제공하는 것입니다. 두 번째는 콜백 중 하나에서 또 다른 약속을 반환하는 것입니다. 여기

당신이 당신의 코드 구조 수있는 방법의 예 :

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