Javascript 函数在不应';T

Javascript 函数在不应';T,javascript,reactjs,firebase,react-native,Javascript,Reactjs,Firebase,React Native,我正在实现一个函数,其中从firebase检索一些数组类型的数据, 然后从该数组中搜索特定元素,如果存在, 我想中止函数并返回调用方。 (React本机应用程序) 代码如下: ref.get().then(snapshot => { const personArr = snapshot.data().winPerson; ... if (personArr != undefined) { personArr.forEach(item => {

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

代码如下:

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");
      }
但是,假设数组中确实存在该元素, 代码同时运行alert和uploadHelper函数(通过日志检查)。首先,我认为forEach是异步函数,所以在返回之前执行uploadHelper; 然而,forEach不是异步函数(在谷歌搜索之后)

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


感谢您的帮助。谢谢你首先,你不能停下来。它将始终为数组的每个元素运行,然后继续执行代码。返回值表示您当前正在迭代的元素将根据您的返回值进行更改


如果要停止执行,可以使用for in循环或generic for循环。

首先,不能停止forEach。它将始终为数组的每个元素运行,然后继续执行代码。返回值表示您当前正在迭代的元素将根据您的返回值进行更改

如果要停止执行,可以使用for in循环或generic for循环。

请改用此循环

for (let item of personArr) {
    if (item == uid.uid) {
        alert(`already subscribed`);
        break;
    }
}
forEach是不可能中断的,这就是为什么您需要使用for来代替并中断它。在forEach中,return意味着不处理下面的代码而继续下一个索引,不要停止循环

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

forEach是不可能中断的,这就是为什么您需要使用for来代替并中断它。在forEach中,return意味着不处理下面的代码就继续下一个索引,不停止循环,它正在返回调用方函数:)a
forEach()
正在使用每个元素调用函数。因此,您将返回,但仅从该元素的函数返回

我认为一个循环的将是您想要的。想要进行函数式编程的人希望使用
.forEach
,但是使用
for of
可以实现与
相同的功能效果。forEach
(无需索引,无副作用),并且可能更易于使用。(如果希望在每个元素之间等待的地方编写异步代码,forEach也会遇到问题)

因此,重写您的代码,如下所示:

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

它正在返回调用方函数:)a
forEach()
正在使用每个元素调用函数。因此,您将返回,但仅从该元素的函数返回

我认为一个循环的将是您想要的。想要进行函数式编程的人希望使用
.forEach
,但是使用
for of
可以实现与
相同的功能效果。forEach
(无需索引,无副作用),并且可能更易于使用。(如果希望在每个元素之间等待的地方编写异步代码,forEach也会遇到问题)

因此,重写您的代码,如下所示:

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

forEach
处理程序也是一个函数。(item=>…是一个箭头函数),因此从内部返回
personArr.forEach()
实际上不会停止函数的其余部分的执行

因此无论.forEach()做什么,if(prop.first.length!=0)都将被检查

如果目标是仅在找不到uid时运行uploadHelper,则需要稍微更改结构。 比如:

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

    ...

    if (personArr != undefined) {
      const match = personArr.find( item => item === uid.uid );
      if ( match ) alert(`already subscribed`);
      else if (prop.first.length != 0) {
        uploadHelper(ref, prop, "first");
      }
      // else { /* some other defualt case ? */ 
     ...
    }
});
如果项实际上与uid.uid的值相同,您甚至可以更简单地执行此操作:


personArr.includes(uid.uid)
应该返回true,如果
uid.uid
personArr
中,
forEach
处理程序也是一个函数。(item=>…是一个箭头函数),因此从内部返回
personArr.forEach()
实际上不会停止函数的其余部分的执行

因此无论.forEach()做什么,if(prop.first.length!=0)都将被检查

如果目标是仅在找不到uid时运行uploadHelper,则需要稍微更改结构。 比如:

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

    ...

    if (personArr != undefined) {
      const match = personArr.find( item => item === uid.uid );
      if ( match ) alert(`already subscribed`);
      else if (prop.first.length != 0) {
        uploadHelper(ref, prop, "first");
      }
      // else { /* some other defualt case ? */ 
     ...
    }
});
如果项实际上与uid.uid的值相同,您甚至可以更简单地执行此操作:


personArr.includes(uid.uid)
应该返回true,如果
uid.uid
personArr
内,或者只是
。如果需要查找一个确切的元素,则find()
而不是
。严格来说不是true…如果在
forEach
内引发异常,它将中断:)true,但是异常将停止执行,而不执行try/catch。因为用例不是必需的:DWow Thank不知道这一点。您在forEach中提到的return语句部分,是只适用于forEach还是全部for,for in循环?@hyuklee它适用于.forEach、.map、.reduce、,。。。只是举几个例子。检查MDN以获取一些示例。常规for-in循环将像往常一样工作。或者如果需要查找一个确切的元素,只需
.find()
而不是
.forEach()
。严格来说,这不是真的……如果在
forEach
中引发异常,它将中断:)true,但异常将停止执行,而不需要try/catch。因为用例不是必需的:DWow Thank不知道这一点。您在forEach中提到的return语句部分,是只适用于forEach还是全部for,for in循环?@hyuklee它适用于.forEach、.map、.reduce、,。。。只是举几个例子。检查MDN以获取一些示例。常规in循环将照常工作。感谢新知识