gpt4 book ai didi

javascript - 如何在循环内完成异步函数后调用函数?

转载 作者:IT王子 更新时间:2023-10-29 06:00:23 25 4
gpt4 key购买 nike

我在 NodeJS 中有一个 forEach 循环,遍历一系列键,然后从 Redis 异步检索这些键的值。循环和检索完成后,我想将该数据集作为响应返回。

我现在的问题是因为数据检索是异步的,发送响应时我的数组没有填充。

我如何在我的 forEach 循环中使用 promise 或回调来确保响应与数据一起发送?

exports.awesomeThings = function(req, res) {
var things = [];
client.lrange("awesomeThings", 0, -1, function(err, awesomeThings) {
awesomeThings.forEach(function(awesomeThing) {
client.hgetall("awesomething:"+awesomeThing, function(err, thing) {
things.push(thing);
})
})
console.log(things);
return res.send(JSON.stringify(things));
})

最佳答案

我使用 Bluebird promises这里。请注意代码的意图非常清晰,没有嵌套。

首先,让我们promisify hgetall 调用和客户端 -

var client = Promise.promisifyAll(client);

现在,让我们使用 promises 编写代码,.then 而不是使用 .map 的 Node 回调和聚合。 .then 所做的是发出异步操作完成的信号。 .map 获取一组内容并将它们全部映射到异步操作,就像您的 hgetall 调用一样。

请注意 Bluebird 如何(默认情况下)向 promisifed 方法添加 Async 后缀。

exports.awesomeThings = function(req, res) {
// make initial request, map the array - each element to a result
return client.lrangeAsync("awesomeThings", 0, -1).map(function(awesomeThing) {
return client.hgetallAsync("awesomething:" + awesomeThing);
}).then(function(things){ // all results ready
console.log(things); // log them
res.send(JSON.stringify(things)); // send them
return things; // so you can use from outside
});
};

关于javascript - 如何在循环内完成异步函数后调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22789236/

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