gpt4 book ai didi

javascript - 通过 for 循环内的异步函数设置变量

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

我遇到过一种情况,在 for 循环内有一个异步函数。我已经完成了先决条件搜索,现在知道 forEach() 或 map() 可能是我需要的解决方案。但我看到的所有示例都只是 console.log() 每个异步函数的结果。如果必须将每个异步函数的结果设置为一个变量,然后仅返回该变量,这将如何工作?

这是我正在做的一些精简代码:(顺便说一下,这全部在 Node 中)

var clients={
"102323":{stuff about this client},
"242341":{stuff about that client}
};
var messages={};
for (var id_client in clients) {
mysql.query("SELECT * FROM messages WHERE id_client='"+id_client+"' ORDER BY date", function(err, rows) {
if (typeof rows !== 'undefined') messages[id_client]=rows;
});
}
//do other stuff with messages variable

有了这个,messages 可以预见的是 null。我明白了。

但即使我将其转换为使用 map() 而不是 for(),就像这样......

var messages={};
Object.keys(clients).map(function(id_client){
mysql.query("SELECT * FROM messages WHERE id_client='"+id_client+"' ORDER BY date", function(err, rows) {
if (typeof rows !== 'undefined') messages[id_client]=rows;
});
});

...消息最终为空。

最后,只是想指出,我确实知道如何使用回调将 mysql.query() 包装到另一个函数中,以及所有这些来解决整个异步问题。我只是不知道如果在循环内部迭代的话,这一切是如何工作的。

最佳答案

您可以使用 Promise。

var messages = {};

Promise.all(Object.keys(clients).map((id_client) => {
return new Promise((resolve, reject) => {
mysql.query("SELECT * FROM messages WHERE id_client='" + id_client + "' ORDER BY date", function(err, rows) {
if (typeof rows !== 'undefined') {
messages[id_client] = rows;
resolve(rows);
}
});
});
})).then(results => {
console.log(messages);
});

关于javascript - 通过 for 循环内的异步函数设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39123576/

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