javascript - 函数在不应该异步运行时异步运行

标签 javascript reactjs firebase react-native

我正在实现一些函数,从 firebase 中检索一些数组类型的数据, 然后从该数组中搜索特定元素,如果存在, 我想中止该函数并返回给调用者。 ( react native 应用程序)

代码如下:

ref.get().then(snapshot => {
    const personArr = snapshot.data().winPerson;

    ...

    if (personArr != undefined) {
      personArr.forEach(item => {
        if (item == uid.uid) {
          alert(`already subscribed`);
          return;
        }
      });

      if (prop.first.length != 0) {
        uploadHelper(ref, prop, "first");
      }

     ...
    }
});

我使用 forEach 遍历数组并查看是否有匹配的元素。如果有匹配,那么它应该提醒并返回调用函数而不运行下面的后续代码,即

if (prop.first.length != 0) {
        uploadHelper(ref, prop, "first");
      }

但是,假设该元素确实存在于数组中, 该代码同时运行警报和 uploadHelper 函数(通过日志检查)。首先我认为 forEach 是异步函数,所以 uploadHelper 在返回之前执行; 但是,forEach 不是异步函数(经过一些谷歌搜索)。

我不知道为什么 uploadHelper 在代码落入 if (item == uid.uid) 条件并返回时运行。

任何帮助表示赞赏。谢谢

最佳答案

它正在返回调用函数:) forEach() 正在调用每个元素的函数。所以你正在返回,但只是从那个元素的函数返回。

我认为您需要一个 for of 循环。想做函数式编程的人想用.forEach,但是用一个for of达到和.forEach一样的功能效果(不必索引,没有副作用)并且使用起来可能更直接。 (如果想在每个元素之间等待的地方编写异步代码,forEach 也会有问题)

所以,像这样重写你的代码:

for (const item of personArr) {
    if (item == uid.uid) {
      alert(`already subscribed`);
      return;
    }
  }

关于javascript - 函数在不应该异步运行时异步运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57321464/

相关文章:

javascript - 如何在 strongloop 的结果中隐藏特定字段

javascript - 无法理解 NodeJS 中的一些基本逻辑

javascript - React 嵌套路由

ruby-on-rails - 我可以在没有 activerecord 的情况下使用 hyperstack 吗?

javascript - 如何在用户登录时显示注销

javascript - 绑定(bind)在动态加载的组件中不起作用

javascript - 我正在编写一个正则表达式来处理以下内容,但我被困在两者之间

ios - 继续特定的 Firebase 数据

node.js - 如何使用node.js在firebase中存储文件

javascript - 比较两个数组时 JSON.stringify 不起作用