2016-12-18 1 views
0

좀 더 숙련 된 JS 프로그래머가 쉽게 해결할 수있는이 질문에 대해 용서해주십시오. 나는 superagent에 대해 읽고 읽고, REST 호출이 작동하도록 시도했다. (제대로 작동하는 odata를 얻을 수 있었지만 이제는 REST가 필요하다). 그러나 나는 약속에 대해 혼란스러워하고 있습니다. 저는 현재 다음 코드를 사용하여 간단한 request.get (또는 fetch.get)를 만들려고 노력 해요 :Superagent & Fetch 반환 약속 - 어떻게 처리 할 것인가?

this.ticketList = Request.get(url).then((response) => { 
    return response.body.Tickets; 
}); 
console.log(this.ticketList); // Returns a promise..? 

나는 약속에 익숙하지있어이 ​​처리하는 방법을 모르겠어요. 내가 읽은 모든 문서는 비동기 호출이 좋은 것이라고 말하지만, 응용 프로그램은 선형이며 계속하기 전에 이전 호출의 데이터가 필요합니다. 나는 약속을 필요로하지 않는다, 나는 완전한 응답을 필요로한다. (약속/아약스에 대한 나의 제한된 이해가 잘못 되었다면 교정 해주세요!)

내가 원하는 응답 객체를주기 위해 어떻게 위의 코드를 변경할 수 있습니까? (JSON 선호) 또는 필요한 데이터를 얻을 수있는 약속을 어떻게 처리합니까?

덕분에, 찰리

+0

추신 : 나는 처음으로 가져 오기를 시도, 그것은 내게 약속했다. 나는 superagent (위의 코드)로 변환했고 또한 나에게 약속을 준다. –

+0

"내가 읽은 모든 문서는 비동기 호출이 좋은 것 같지만 내 응용 프로그램은 선형이며 계속하기 전에 이전 호출의 데이터가 필요합니다." - 이것이 바로 약속이 해결하도록 고안된 문제입니다. 그들은 ES7 비동기보다 혼란 스럽다/우리 모두가 곧있을 것으로 기대하지만, 비동기 코드를보다 쉽게 ​​관리 할 수 ​​있도록 근본적으로 설계되었습니다. – PMV

답변

1

기본적으로 약속으로, then을 연결하여이 문제를 해결할 수 있습니다. 이 특정한 경우

Request.get(url) 
     .then((response) => { 
      return response.body.Tickets; 
     }) 
     .then((ticketList) => { 
      console.log(ticketList); 
     }); 

정말이 개 then의이 점을 나누는 대신에 단지 직접 response.body.Tickets 작업에 이점이 아니다. 일반적으로 비동기 호출을하는 데 필요한 다음 단계가 될 때까지 여기서 모든 작업을 수행 한 다음 새로운 약속을 얻습니다. 예를 들면 :

Request.get(url) 
     .then((response) => { 
      var ticketList = response.body.Tickets; 
      console.log(ticketList); 
      return Request.get(url2); 
     }) 
     .then((response2) => { 
      /* ... */ 
     }); 

기본적으로, 당신은 바로 첫 번째 비동기 호출이 전화 발신 then 문에 제공되는 콜백 내에서 발생 (또는 catch 성명에 따라 모든 것을 만들 같은 작업의 선형 집합이있는 경우 거부 된 약속을 처리한다.)

+0

감사합니다. 이것은 나를 도왔다. 다음 API 호출을하기 전에 사용자가 무언가를 선택할 때까지 기다려야하므로 첫 번째 예제를 사용했다. 건배! –

1

당신은 then 문에서 데이터를 요구하는 전화를 포장해야합니다. 불행히도 대부분의 HTTP 요청은 비동기 적이며 심각한 문제가 없이는 할 수있는 일이 많지 않습니다.

약속의 값을 다른 함수에 반환해야하는 경우 약속 자체를 반환하고 해결 된 후에 처리하는 것이 좋습니다. 당신이 처음에 약속을 처리하는 방법을 배울 때

function shareTickets() { 
    // Get the promise to resolve 
    var getTicketPromise = getTickets(); 

    // Resolve the promise and handle as needed 
    getTicketPromise 
    .then((ticketData) => { 
     console.log('I got the data from the promise: ' + ticketData); 
     doSomethingWithData(ticketData); 
    }) 
    // If an error happens, you can catch it here 
    .catch((error) => console.log(error)); 
} 

// Return the promise itself so it can be resolved in the other function. 
function getTicketPromise() { 

    // Just return the promise 
    return Request.get(url); 
} 

그것은 고통의 약간의 그러나 그들은 거대한 지불 : 코드를 기반으로

예는 당신이 포기했습니다. 잠시 연습을 계속하면 결과적으로 잠깐 기다리게됩니다.