gpt4 book ai didi

javascript - Node.js - 使用多个查询异步构建 JSON

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:18 25 4
gpt4 key购买 nike

我上周开始使用 Node.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。

最佳答案

我看到你已经得到了答案,但我想我可以看看是否可以使用异步制作一个真正优雅的解决方案(应该比原始解决方案更少的代码和/或更容易阅读),只是作为练习。它是:

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));
});

build_* 函数还必须回调 null(或错误)作为第一个参数。这通常是一个好主意,因为大多数 Node.js 的 api 和模块都是这样工作的。例如:

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 也能正常工作。

关于javascript - Node.js - 使用多个查询异步构建 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18437318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com