2017-11-09 15 views
0

예를 들어 더 많은 데이터 (해당 사용자와 연결된 팀)를 검색 할 수 있도록 API (사용자)에서 일부 데이터를 검색하려고합니다. 예 :중첩 노드 가져 오기 호출을 구현하려면 어떻게해야합니까?

var fetch = require('node-fetch'); 

app.get('/users/:username', function (req, res) { 
    var username = req.params.username; 
    var user = new Object(); 
    fetch('https://api.github.com/users/' + username) 
    .then(function(res) { 
     return res.json(); 
    }).then(function(json) { 
     console.log(json); 

     user.handle = json.login; 
    }).then(fetch('https://api.github.com/users/' + username + '/repos') 
     .then(function(res) { 
      return res.json(); 
     }).then(function(json) { 
      console.log(json); 
      //user.repos = repos 
      var payload = new Object(); 
      payload.user = user; 
      console.log(payload); 
      res.send(payload); 
     }) 
    ); 
}); 

저는 노드를 처음 사용하는 데 어려움이 있으며 제대로 수행하는 방법을 찾지 못했습니다. 첫 번째 가져 오기 호출은 잘 작동하지만 중첩 된 호출은 너무 많지 않습니다. 올바른 방향으로 나를 가리키는 오류 메시지는 없습니다. 당신이 .then()에 그 결과를 전달하는 즉시 fetch()를 호출하고, 당신이 그 일을했다

.then(() => fetch('https://api.github.com/users/' + username + '/repos').then(...)) 

방법이에

.then(fetch('https://api.github.com/users/' + username + '/repos').then(...)) 

:

답변

1

당신은이 구조를 변경해야합니다. 위에서 설명한 두 번째 옵션을 수행해야하는 방식은 약속 인프라에서 LATER라고 부를 수있는 함수 참조를 전달합니다.

는 당신이 실제로 무슨 일이 일어나고 있는지 좀 더 자세히 보여주기 위해이 원하는 구조 :

.then(function(priorData) { 
    return fetch(...).then(...); 
}); 

이것은 .then() 핸들러가 호출 될 때까지 인출 실행되지 않고 그것은에서 새 약속을 반환 fetch(), 따라서 원래 사슬에 연결합니다. 이 대답의 두 번째 코드 블록에 표시된 화살표 함수 예제는이 마지막 코드 블록과 동일한 결과를 얻습니다. fetch()에 대한 일반적인 의견으로


, 당신이 호출은 다른 그래서 당신이 병렬로 두 가지를 동시에 실행할 수 있습니다 하나에 의존하지 않으며 그것은 당신에게 빠른 최종 결과를 얻을 가능성이있다.

그의 일반적인 구조는 다음과 같습니다

Promise.all([fetch(url1), fetch(url2)]).then(function(results) { 
    // results[0] is result of first fetch 
    // results[1] is result of second fetch 
}); 

그런 다음, 그 .then() 핸들러 내부에, 당신은 둘 다 결과가 당신의 응답을 공식화하는 데 사용할 수 있습니다.

+0

나는 당신이 말하는 것을보고 있습니다. 나는이 약속의 물건을 읽어야한다. 가장 중요한 점은 내 서버가 get 요청을 받으면 결합 된 데이터가 포함 된 응답을 보내기 전에 두 페치를 모두 완료해야한다는 것입니다. – Roderick

+0

@VGambit - 그럼, 내'Promise.all()'예제를 사용하고 싶을 것입니다 (방금 오류가 수정되었습니다). – jfriend00