在 for each 循环中的异步代码

3

这是我的第一篇文章,因为我通常会通过旧消息找到回答我的问题的方法...但这一次我卡住了。希望你能帮助我。

searchUser.forEach(function(item, i) {
        getUser(item)
        .then(objUser => {
            console.log(i);
            console.log(objUser);
            name = objUser.name;
            let idConversation = objUser.id;
            createNewConversation(name, idConversation)
        })
    })

我的getUser是一个异步函数,但不知道为什么,似乎我的构造函数不起作用。它只创建了我拥有的会话数量,但内容都是最后一次会话的内容,而不是其他的……你知道我错了哪里吗?另外,console.log(i)输出了10

顺便说一下,getUser是一个返回用户数据函数


2
在回调函数的作用域之外设置变量 name,但不使用关键字 (let/const/var) 在 name 变量前面。 - Constantin Groß
真的!谢谢Constantin,但这并没有改变问题。 - Naco
使用数组或对象来存储每次迭代的结果。 - Sim1-81
createNewConversation(name, idConversation) 方法用于创建带有名称和ID的对话,您能展示一下该方法是如何实现的吗? - vipul patel
实际上,我简化了一下示例。createNewConversation 运行良好。问题出在 for Each 循环中的异步 getUser 上。而我的 getUser 里还有另一个回调函数... - Naco
1个回答

4

在forEach循环中使用异步函数可能会很棘手,我建议使用Promise.all在所有的promise都解决后调用createNewConversation

const promises = searchUser.map(item => getUser(item));

Promise.all(promises).then(result => {
  result.forEach(({ name, id }) => {
    createNewConversation(name, id);
  });
});

我仍然面临同样的问题,我的构造方式会创建一个对话数量,但只包含最后一次对话的内容而不是其他对话。我的问题可能出现在其他地方,但我没有看到吗? - Naco
在调用createNewConversation之前,很可能需要使用console.log打印出nameid,以查看是否使用相同的idname进行调用。 - Taki
我在searchUser函数中有另一个回调。我认为这可能是从这个点来的。你觉得呢? - Naco
无法回答这个问题,除非知道另一个回调函数。 - Taki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接