在Node.js中处理异步循环的最佳模式
我是Node的新手,并试图确保我对JSON驱动的Web应用程序使用了合理的设计。
我已经在Redis中存储了一堆数据,并且正在通过node检索它们,并将结果从Redis中流出来。这是我正在做的一个很好的例子:
app.get("/facility", function(req, res) {
rc.keys("FACILITY*", function(err, replies) {
res.write("[");
replies.forEach(function (reply, i) {
rc.get(reply, function(err, reply) {
res.write(reply);
if (i == replies.length-1) {
res.write("]");
res.end();
}
else
res.write(",");
});
});
});
});
本质上,我是从Redis获取一组密钥,然后请求每个密钥,然后将结果流式传输到半手动创建的JSON(来自Redis的字符串已经在JSON中)。现在,这很好用,但是我不禁会以为i
== replies.length-1有点不整洁?
我可以在Redis中使用mget来完成所有这一切,但这并不是我想要得到的重点。这是处理forEach异步循环,流式传输输出并优雅地用res.end关闭连接的最佳方法。
这是最好的方法,还是我可以遵循的更优雅的模式?
-
上面的代码可能无法满足您的期望。您将按
.get()
顺序开始每一个,但它们可能不会按顺序回叫-
因此结果可以按任何顺序输出。如果要流式传输结果而不是将其收集到内存中,则需要.get()
按顺序进行。我认为caolan的异步库使此操作变得更加容易。您可以使用以下一种方法来按顺序获取每个项目(警告,未经测试):
app.get("/facility", function(req, res) { rc.keys("FACILITY*", function(err, replies) { var i = 0; res.write("["); async.forEachSeries(replies, function(reply, callback){ rc.get(reply, function(err, reply) { if (err){ callback(err); return; } res.write(reply); if (i < replies.length) { res.write(","); } i++; callback(); }); }, function(err){ if (err) { // Handle an error } else { res.end(']'); } }); }); });
如果您不关心订单,请
async.forEach()
改用。如果您不介意收集结果并希望它们按顺序返回,则可以这样使用
async.map()
(警告,也未经测试):app.get("/facility", function(req, res) { rc.keys("FACILITY*", function(err, replies) { async.map(replies, rc.get.bind(rc), function(err, replies){ if (err) { // Handle an error } else { res.end('[' + replies.join(',') + ']'); } }); }); });
-
在node.js中异步循环
2021-01-31 关注 0 浏览107 1答案
-
在node.js中异步循环
2021-02-02 关注 0 浏览99 1答案
-
node.js中的for循环和异步回调?
2021-01-31 关注 0 浏览66 1答案
-
使用Node.js异步请求在Redis中进行循环
2021-02-01 关注 0 浏览207 1答案
-
在Node.js中执行并行处理的最佳方法
2021-01-31 关注 0 浏览114 1答案
-
异步node.js调用中的错误处理
2021-01-31 关注 0 浏览140 1答案
-
如何处理 Node.js 中的循环依赖
2022-07-28 关注 0 浏览11 1答案
-
使用node.js的Javascript异步异常处理
2021-01-31 关注 0 浏览127 1答案
-
如何处理Node.js中的循环依赖关系
2021-01-31 关注 0 浏览188 1答案
-
Node.js:执行多个异步操作然后执行其他操作的最佳方法?
2021-01-31 关注 0 浏览184 1答案