2017-12-30 14 views
0

필자가 작성한 테스트에서 약속을 사용하는 방법을 알아 내려고하고있다. 나는 브라우저에서 평범한 약속을 사용하고있다.응답 콜백시 약속 사용하기

server.onresponse = function(data){ 
    //do stuff with data 
} 
: 내가 지금처럼 콜백을 등록 할 경우 (아직) 없음 라이브러리

시험은 내가

내가 서버 개체가 콜백을 통해 서버 응답을 서버, 비동기 통신 없습니다 필요

테스트에서는 서버 응답에 따라 변경되는 일련의 명령을 서버에 보내야합니다. 서버에 명령을 보내십시오.

server.sendCommand({data:"do something"}) 

서버는 응답 콜백을 발생시킵니다. 다음 명령이 무엇인지 결정하기 위해 서버가 보낸 데이터를 읽어야합니다.

상호 작용은

  • send 명령 1과 같이하고 콜백
  • send 명령이 onresponse에서
  • 프로세스 데이터를 기다려 콜백 onresponse에서
  • 프로세스 데이터를 기다려야한다

나는이 상호 작용을 조금 더 명확하게하기 위해 약속을 사용하고 싶습니다. 같은 일련의 .then()처럼.

약속이 재사용 될 수 없다는 것을 깨닫기 때문에 onresponse 콜백이 발생할 때마다 동일한 약속을 재설정 할 수있는 것과 다릅니다.

약속을 통해이를 수행 할 방법이 있습니까? 나는 발전기를 읽기 시작했다. 그게 도움이 될까요?

감사

+1

어떻게 사용에 대한 ['Events' (https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events)? – Adriani6

+0

이벤트는 어떻게 도움이 될까요? –

+0

예,이 API는 작업에 유용하지 않습니다.왜'sendCommand'는 글로벌'onresponse' 콜백을 실행하는 대신 응답에 대한 약속을 리턴하지 않습니까? – Bergi

답변

1

이 같은 수 :

function sendCommand(data) { 
    return new Promise(function(resolve,reject) { 
     server.onresponse = resolve; 
     server.sendCommand(data); 
    }); 
} 

과 같이 사용 :

sendCommand({data:"do something"}) 
.then(function(data) { 
    console.log(data); 
    return sendCommand({data:"do something else "}) 
}) 
.then(function(data) { 
    console.log(data); 
}) 
0

당신은 당신이 설명 그냥 뭐 할 수있는 도우미 함수를 작성할 수 있습니다. 명령을 전달하면 서버의 응답으로 해결되는 Promise가 반환됩니다. 오류 처리 콜백이있는 경우이 콜백도 사용해야합니다. 예를 들어, server.onerror이라고합시다. 올바른 핸들러가 무엇이든이를 바꿔야합니다.

function sendCommand(cmd) { 
    const promise = new Promise((resolve, reject) => { 
    server.onresponse = resolve; 
    server.onerror = reject; 
    }); 
    server.sendCommand(cmd); 
    return promise; 
} 

당신이 약속 한 체인과 똑같이 사용하십시오. 물론, 다음 명령을 실행하기보다는 응답으로 무엇인가를하고 싶을 것입니다. 항상 끝에있는 오류를 처리하는 것을 기억하십시오 catch!

sendCommand({data: "do thing 1"}) 
    .then((response) => sendCommand({data: "do thing 2"})) 
    .then((response) => sendCommand({data: "do thing 3"})) 
    .then((response) => console.log("All done!")) 
    .catch((error) => console.log("Oops!")); 
관련 문제