我正在实现一些函数,从 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/