Javascript 函数在不应';T
我正在实现一个函数,其中从firebase检索一些数组类型的数据, 然后从该数组中搜索特定元素,如果存在, 我想中止函数并返回调用方。 (React本机应用程序) 代码如下: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 => {
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循环将照常工作。感谢新知识