有没有办法破坏匿名函数中的 Javascript 函数
Is there any way to break Javascript function within an anonymous function?
我只想检查我要插入的所有就绪数据是否存在于我的Firebase上,如果是这样,我只想破坏add函数:
FBDB.addCampain=function (campain){
CampiansRef.once('value',function(snapshot){
snapshot.forEach(function(childSnapshot){
if(campain.Name==childSnapshot.val().Name){
console.log("campain allredy exists on the DB");
return false; //I want to break the addCampain function from here!
}
});
});
var newCampainRef = CampiansRef.push();
campain.id = newCampainRef.key();
newCampainRef.set(campain,function(error){
if(error){
console.log("an error occured the campain did not add to the DB, error:" ,+error);
return false;
}
else{
console.log("campain succssesfuly added to the DB");
return true;
}
});
};
目前发生的情况是,即使活动存在于数据库中,它仍然继续实际添加代码。必须有一种方法可以在其中的匿名函数中"破坏"addCampain
函数,甚至将"return false"传递到主范围。
如果添加一些console.log
语句,您将能够看到代码的流动方式:
console.log('1. starting call to Firebase');
CampaignsRef.once('value',function(snapshot){
console.log('3. for value from Firebase');
snapshot.forEach(function(childSnapshot){
console.log('4. inside childSnapshot');
if (campaign.Name==childSnapshot.val().Name){
console.log("campaign already exists on the DB");
return false;
}
console.log('5. done with snapshot.forEach');
});
});
console.log('2. we started the call to Firebase');
输出将如下所示:
1. starting call to Firebase
2. we started the call to Firebase
3. for value from Firebase
4. inside childSnapshot
4. inside childSnapshot
4. inside childSnapshot
5. done with snapshot.forEach
这可能不完全是您所期望的。 2.
位于代码块的末尾,但它在1.
之后立即触发,即在开始时。这是因为on
会从 Firebase 异步加载数据。由于这需要时间,浏览器在块后继续使用代码。从Firebase的服务器下载数据后,它将调用回调,您可以执行所需的操作。但到那时,原始上下文已经结束。
JavaScript 中没有办法等待异步函数完成。虽然如果存在这种方式,您可能会感激,但您的用户会对以下事实感到沮丧:当您对 Firebase 的调用停止时,他们的浏览器被锁定。
相反,您有两种选择:
- 将回调传递到函数中
- 返回承诺
我将使用下面的选项 1,因为这是 Firebase JavaScript SDK 已经执行的操作。
FBDB.addCampaign=function (campaign, callback){
CampaignsRef.once('value',function(snapshot){
var isExisting = snapshot.forEach(function(childSnapshot){
if(campaign.Name==childSnapshot.val().Name){
return true; // this cancels the enumeration and returns true to indicate the campaign already exists
}
});
callback(isExisting);
});
};
你可以像这样调用它:
FB.addCampaign(campaign, function(isExisting) {
console.log(isExisting ? 'The campaign already existed' : 'The campaign was added');
};
请注意,从服务器加载所有广告系列以检查特定的广告系列名称是否已存在是非常浪费的。如果您希望广告系列名称是唯一的,则不妨按名称存储广告系列。
CampaignsRef.child(campaign.Name).set(campaign);
根据 Firebase 文档,如果您的回调函数"通过返回 true
取消枚举",snapshot.forEach
返回true
。因此,只需将您的return false
更改为return true
!
forEach
循环中设置一个"全局"(到你的addCampaign
函数(标志,然后在你回到主函数时检查这个标志,如果设置了,则返回。
- 从函数JavaScript返回不可变数组/对象
- 将对象传递给函数.JavaScript
- 如何定义const函数javascript(语法糖)
- 新的日期函数javascript
- TypeError:this.getAttribute不是一个函数-javascript
- 从函数javascript发送变量
- 扩展自容器函数Javascript
- 从内部函数javascript内部分配外部函数的对象
- 使用函数JavaScript中的函数
- 在这里使用回调函数(JavaScript)有什么好处吗
- 来自函数 Javascript 的 NaN 返回值 ||函数执行顺序
- 将“e”传递给一个新函数 - javascript
- 调用函数中的一个函数——Javascript
- 传递的变量不适用于我的函数-Javascript
- 如何将类方法设置为等于多个函数?-Javascript
- 显示php中的函数javascript
- 如何使用php代码创建函数Javascript弹出框
- 未调用的外部函数-javascript
- 如何在类中运行函数.Javascript
- 关闭mouseover上的一个函数——Javascript,jQuery