2016-06-28 2 views
-2

다음 nodejs가 마지막에 인쇄 second console.log 명령을 동 기적으로 실행하길 원합니다.nodejs를 동 기적으로 호출하십시오.

여기 mnay 솔루션을 확인했습니다. 해결책을 제공해주십시오.

var request = require('request') 
var op=[]; 
request({ uri: 'http://api.usergrid.com/siddharth1/sandbox/volvos/John' }, function(err, response, body){ 
    // use body 
    //console.log(body); 
    var body2 = JSON.parse(body); 
     op = body2.entities.map(function(item) { 
      return item.name; 
     }); 
     console.log("inside log "+op); 

}) 
console.log("outside log "+op); 
+2

불가능합니다. 콜백 또는 약속 사용 –

+0

코드를 친절하게 편집 할 수 있습니까? 나는 서둘러있다. 만약 가능하다면 유사한 exmaple에 대한 어떤 링크도 좋을 것입니다 –

+0

** 반드시 **해야만합니다. 그러면'sync-request' npm 모듈을 사용할 수 있습니다 - https://github.com/ForbesLindesay/sync-request API는 기본적으로 표준'request' 모듈과 동일하지만 동 기적으로 작동하며 할당을 통해 결과를 직접받습니다. –

답변

2

잘못된 문제를 해결하려고합니다. 이 코드를 동 기적으로 실행하지 않으려면 응답을받은 후 console.log을 실행하기 만하면됩니다. 이것은 매우 간단합니다.

var request = require('request') 
request({ uri: 'http://api.usergrid.com/siddharth1/sandbox/volvos/John' }, function(err, response, body) { 
    // use body 
    //console.log(body); 
    var body2 = JSON.parse(body); 
    var op = body2.entities.map(function(item) { 
    return item.name; 
    }); 
    console.log("log "+op); 
}) 

그것은 동기로 요청을 강제로 "노드와 같은"아니다 당신이 그 일을 (힌트 : 당신이하지 않는)를위한 아주 좋은 이유가없는 아주 나쁜 연습 *입니다; 노드가 단일 스레드 인 경우 요청을 동기식으로 강요하면 요청이 차단되고 실제로 노드를 사용하면 이익을 잃을 수 있습니다. 그러지 마.

두 개의 console.log가 필요한 이유가 무엇인지 잘 모르겠다. 아마도 당신이 묻는 것을 오해했을 것입니다. 당신이 할 수없는 이유에 관해서는

console.log외부 통화 request에 : 당신이 request에 전달하는 기능이 미래의 어떤 시점에서 실행되는 즉시 실행되지 않습니다, 그러나 그것은 결코 즉시. 즉, request에 대한 호출 이후에 실행 된 코드는 항상 이 실행되고 전에 전달 된 함수는 request이됩니다.

이것은 노드의 기본 패턴입니다. 모든 I/O는 기본적으로이 동작을가집니다. 요약

: 당신은 어느 질문을 잘못 이해했거나 당신에게 질문을하는 사람들이 의도적으로 당신은 당신이 원하는 것은 불가능하다는 결론에 도달하려고 노력하고 있습니다 (물론, 또는 권장하지 않음)

+0

안녕하세요. 회신 해 주셔서 감사합니다. 실제로 나는 함수 밖에서'op' 배열을 원합니다, 그래서 다른 배열과 비교하고 물건을하기 위해 그 데이터를 사용할 수 있습니다. 그러나이 코드를 사용하면 문제가 발생하지 않습니다. 나는 혼란스럽고 나의 질문은 혼란 스럽다고 생각한다. –

+1

그럴 수 없습니다. 콜백이 호출 될 때까지 채워지지 않기 때문에 콜백 외부의'op' 배열 요소에 액세스 할 수 없습니다. 당신이 원하는 것은'async'와 같은 제어 흐름 라이브러리를 사용하거나 약속을 사용하는 것입니다. –

+0

좋아, Dan이 포인트를 얻었다. 마지막 질문 하나, 요청에 헤더를 어떻게 추가 할 수 있습니까? uri와 함께 인증 헤더를 전달해야합니다. –

관련 문제