2013-04-19 4 views
1

나는 node.js를 사용하여 반환 할 DNS 조회를 수행하고 IP 주소 (http://nodejs.org/api/dns.html)를 사용하고 있습니다. 이 예제에서는 콜백 범위를 벗어나는 변수에 액세스 할 수 있지만 내 결과가 올바르게 기록되도록 할 수 있습니다. 이것이 어떻게 가능할까요?콜백에서 값을 반환하는 방법

내 현재 코드 :

var domain = 'google.co.uk'; 

dns.lookup(domain, function (err, aRecord) { 
    if (err) throw err; 
    console.log(aRecord); 
}); 

이상적으로, 나는의 라인을 따라 뭔가를 수행 할 수 있도록하고 싶습니다 :

var domain = 'google.co.uk'; 

var myfunction = dns.lookup(domain, function (err, aRecord) { 
    if (err) throw err; 
    return aRecord; 
}); 

var result = myfuction(domain); 
+0

불가능합니다. 그렇다면 콜백을 제공 할 필요가 없습니다. 동기 및 비동기 코드에 대한 설명은 [내 대답은 여기] (http://stackoverflow.com/a/14220323/218196)의 첫 번째 부분을 참조하십시오. –

+0

이 dup dup의 잠재적 Dup : http://stackoverflow.com/questions/6847697/how-to-return-value-from-callback-function. – Mogsdad

+0

합리적인 해결 방법은 [here] (http://stackoverflow.com/a/6847754/1677912)에 설명되어 있습니다. – Mogsdad

답변

2

마찬가지로 비동기 적이기 때문에 불가능합니다. 모든 코드를 콜백 내에 배치 할 수 있지만 그다지 좋지 않을 수 있습니다.

단방향 개발자가 약속을 사용하는 데이터를 반환하는 비동기 작업을 처리 할 수 ​​있습니다. 내가 약속 한 개념에 대해 읽은 최고의 기사는 다음과 같습니다. http://blog.jcoglan.com/2013/03/30/callbacks-are-imperative-promises-are-functional-nodes-biggest-missed-opportunity/ 읽어주세요!

노드에서 잘 알려진 약속 라이브러리 Q입니다 : https://github.com/kriskowal/q

당신이 자바 스크립트에서 비동기 동작/관리에 더 개념 approah을 원하는 경우에, 트레버 번햄에 의해 정말 좋은 책이라고있다 "비동기 자바 스크립트"http://pragprog.com/book/tbajs/async-javascript

0

당신은 할 수 없습니다. Javascript가 비동기입니다. 논리를 가진 모든 코드를 콜백에 배치해야합니다.

자바 스크립트는 var result = myfuction(domain); 이후에 코드를 계속 실행하며 콜백이 실행되기를 기다리지 않습니다. 그리고 당신의 함수는 아무 것도 반환하지 않을 것입니다. (정의되지 않았습니다) 결과적으로

+3

JavaScript 자체가 비동기는 아니지만 대부분의 노드 메소드는 비동기입니다. –

+0

그냥 무슨 뜻인지 :) 연산자는 물론 하나씩 호출됩니다. – shift66

1

Simon과 같이 Promise를 사용할 수 있습니다. 오타가 없으면 다음이 작동합니다.

var Q = require('q'); 

var domain = 'google.co.uk'; 

function myFunction(domain){ 

    var deferred = Q.defer(); 

    dns.lookup(domain, function (err, aRecord) { 
     if (err) { 
      return deferred.reject(err); 
     } 
     deferred.resolve(aRecord); 
    }); 

    return deferred.promise; 
}  

var lookupPromise = myFunction(domain); 

lookupPromise.then(function(response){ 
    console.log(response); 
}) 

이 접근법에 대한 좋은 점 중 하나는 약속을 다른 함수에 인수로 전달할 수 있다는 것입니다. 그런 다음 약속을 수락 (및 반환)함으로써 DNS 조회 함수가 반환 한 데이터를 사용하는 함수를 작성할 수 있습니다.

function useLookup(lookupPromise){ 
    var deferred = Q.defer(); 

    lookupPromise.then(function(lookupResponse){ 
     deferred.resolve(lookupResponse); 
    }).fail(function(err){ 
     deferred.reject(err); 
    }) 

    return deferred.promise; 
} 
관련 문제