2013-08-26 43 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似乎是一個完成方法的選擇的武器,它實際上取得了完整的結果,並對它做了一些事情。 – 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的apis和模塊都是這樣工作的。例如:

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

請注意,我並沒有實際測試過它,但它應該工作。

所以這裏的神奇之處在於,async.series可以將結果組成結果作爲對象,其中結果的鍵與分配函數相同。因此,您不需要爲對象賦值,但可以立即將其轉換。 async.apply只是使用已有的參數調用函數的一種更簡單的方法。普通的方法是:

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

另一種方法是重寫你的抓取功能是這樣的:

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

,並利用它們是這樣的:

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

這將是更清潔。另請注意,如果您可以同時運行查詢,則async.parallel也可以正常運行。

+0

這就是我爲演員,演員寫的:function(callback)build_actor(post,function(actor){ callback(null,actor); }); } 我不得不做回調(null,actor);而不是回調(演員);它的工作。謝謝!乾杯! –

+1

啊,是的,當你不遵循作爲回調中的第一個參數傳遞錯誤的約定時,你將不得不這樣做。我將編輯帖子,建議將build_ *函數更改爲'callback(null,actor)',以便與節點標準實踐更加一致。 –