【问题标题】:Asynchronous code inside an for each loopfor each 循环中的异步代码
【发布时间】:2019-10-01 14:03:51
【问题描述】:

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

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) 给了1,然后是0。

仅供参考,getUser 是一个函数,它返回来自用户的数据。

【问题讨论】:

  • 如果在 name 变量前使用关键字 (let/const/var),则您将变量设置在回调函数的范围之外
  • 真的!谢谢康斯坦丁,但这并不能改变问题。
  • 使用数组或对象来存储每次迭代的结果
  • createNewConversation(name, idConversation) 方法创建带有名称和 ID 的对话??你能展示一下这个方法是如何实现的吗?
  • 其实我简化了一下这个例子。 createNewConversation 工作正常。问题出在 for Each 循环中的异步 getUser 上。而且我的 getUser 里面还有另一个回调......

标签: javascript asynchronous foreach


【解决方案1】:

在 forEach 循环中包含异步函数可能很难调试,我建议在解决所有承诺后使用Promise.all 调用createNewConversation:

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

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

【讨论】:

  • 我仍然遇到与我的构造相同的问题......它创建了我拥有的对话数量,但使用的是最后一次对话的内容,而不是其他对话的内容。我的问题可能出在其他地方而我没有看到吗?
  • probaby、console.log name 和 id 在您调用 createNewConversation 之前查看您是否使用相同的 id 和 name 调用它
  • 我的 searchUser 函数中有另一个回调。我认为这可能来自这一点。你怎么看?
  • 可能是..在不知道其他回调的情况下无法真正回答这个问题
猜你喜欢
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多