2013-08-26 6 views
1

지난 주에 Node.js에서 코딩을 시작했습니다. 내가 JSON 쿼리 여러 테이블을 생성하는 코드와 not sure if this is correct way of coding asynchronouslyNode.js - 여러 쿼리와 비동기 적으로 JSON 작성

build_actor(post, function(actor){ 
    build_post_object(post, function(post_object){ 
    build_post_attachments(post, function(attachments){ 
     build_post_comments(post, function(comments){ 
     var post_obj = {}; 
     post_obj.actor = actor; 
     post_obj.object = post_object; 
     post_obj.attachments = attachments; 
     post_obj.comments = comments; 
     console.log(JSON.stringify(post_obj)); // generates JSON 
     }); 
    }); 
    }); 
}); 

function build_actor(post, callback){ 
    //query 
    callback(actor); 
} 
function build_post_object(post, callback){ 
    //query 
    callback(post_object); 
} 
function build_post_attachments(post, callback){ 
    //query 
    callback(attachments); 
} 
function build_post_comments(post, callback){ 
    //query 
    callback(comments); 
} 

는 친절하게 여러 쿼리를 작성하고 JSON을 구축하기위한 더 좋은 방법이 있다면 알려 주시기를 썼다.

+1

비동기 라이브러리 https://github.com/caolan/async를 살펴보십시오. 그런 다음 모든 기능을 직렬로 호출하거나 (서로 의존적 인 경우) 병렬로 처리 한 다음 모두 완료 될 때까지 기다릴 수 있습니다. async.parallel은 실제로 전체 결과를 가져 와서 처리하는 finish 메서드를 사용하여 여러분에게 가장 적합한 무기 인 것처럼 보입니다. – Todilo

+0

이것은 내가 원했던 것입니다 :) 감사합니다 :) –

답변

1

나는 이미 답을 얻었으나 비동기를 사용하여 정말 우아한 솔루션을 만들 수 있는지 알 수 있다고 생각했다. (원래 솔루션보다 코드가 적고 읽기가 쉬워야한다.) 운동. 그리고는 다음과 같습니다

async.series({ 
    actor: async.apply(build_actor, post), 
    post_object: async.apply(build_post_object, post), 
    attachments: async.apply(build_post_attachments, post), 
    comments: async.apply(build_post_comments, post) 
}, 
function (err, result) { 
    console.log(JSON.stringify(result)); 
}); 

빌드가 _ * - 함수는 첫 번째 인수로 널 (또는 오류) 콜백해야합니다. 이것은 일반적으로 node.js의 api와 모듈의 대부분이 그런 식으로 작동하기 때문에 좋은 생각입니다. 나는 실제로 그것을 테스트하지 않은,하지만 작동합니다

function build_actor(post, callback) { 
    // Query 
    callback(null, actor); 
} 

참고 : 예를 들면.

그래서 여기서 마술은 async.series이 결과를 객체로 구성 할 수 있다는 것입니다. 여기서 결과의 키는 함수를 할당하는 것과 같습니다. 따라서 객체에 값을 넣지 않아도되지만 곧바로 변환 할 수 있습니다. async.apply은 이미 사용 가능한 인수가있는 함수를 호출하는 간단한 방법 일뿐입니다. 일반 방법은 다음과 같습니다

function build_actor(post){ 
    return function (callback) { 
    //query 
    callback(null, actor); 
    }; 
} 

을 그리고 다음과 같이 사용할 :

async.series({ actor: build_actor(post) }, ...); 

것은 심지어 청소기 될 것이라고

function (callback) { 
    build_actor(post, callback); 
} 

또 다른 방법이처럼 가져 오는 기능을 재 작성하는 것입니다 . 또한 쿼리를 동시에 실행할 수 있다면 async.parallel도 마찬가지로 작동합니다.

+0

이것은 내가 배우, 배우에 대해 쓴 것입니다 : function (callback) { build_actor (post, function (actor) { callback (null, actor); }}); } 콜백 (null, actor)을 수행해야했습니다. 콜백 (액터) 대신; 그리고 효과가있었습니다. 감사! 건배! –

+1

아, 그렇습니다. 콜백의 첫 번째 인수로 오류를 전달하는 규칙을 따르지 않을 때 그렇게해야합니다. 이 게시물을 편집하여 build_ * 함수가 노드 표준 관행에보다 부합하도록'callback (null, actor) '으로 변경되었음을 제안합니다. –

관련 문제