我面临一个非常奇怪的情况。在第1行代码之前执行的第2 /第3行代码,我不认为代码是异步的。
以下是我的构造函数的样子:
this.menu = this.navParams.get('menu')
console.log(this.menu) //code line 31
为了确保在加载页面后菜单值仍然相同,我在ionViewDidLoad()
- 第38行的console.log,结果是相同的。你现在可以看到没有“approvedBy”。
现在我执行一个函数,即approveMenu()
approveMenu() {
console.log(this.menu) //line 52
let newMenu = this.menu //line 54
console.log(newMenu) //line 55
newMenu['approvedBy'] = this.currentUser.uid //line 56
console.log(newMenu) //line 57
}
然而,在我执行该功能后,{I}将被添加到菜单中,然后我将其放入其中。
你可以参考下面的截图,console.log的顺序是正确的,但第52行和第54行console.log不应该"approvedBy"
对吗?它应该只显示在第57行,因为"approvedBy"
在第56行添加到"approvedBy"
。
但显然它没有按预期工作,请赐教。
被修改
感谢PierreDuc解决我的问题。
之后,使用相同的功能,它调用我的提供程序来更新我的数据库。这是approveMenu()
的扩展menu
当我调用restaurantProvider的approveMenu() {
console.log(JSON.parse(JSON.stringify(this.menu)))
let newMenu = this.menu
console.log(JSON.parse(JSON.stringify(newMenu)))
newMenu['approvedBy'] = this.currentUser.uid
console.log(Object.assign({}, newMenu))
console.log(Object.assign({}, this.menu))
this.restaurantProvider.approvePendingMenu(this.menu).then(()=>{
this.alertProvider.successful('Successful','The menu has been added to your restaurant and it can be view by public now','Noted')
this.navCtrl.pop()
}).catch(err=>{
this.alertProvider.successful('Something Went Wrong',err,'Noted')
})
}
函数时,某些代码没有按照我的期望处理。我先告诉你approvePendingMenu(this.menu)
:
approvePendingMenu(this.menu)
在第98行,我从approvePendingMenu(menu){
console.log(Object.assign({}, menu))
return this.pendingSuggestiontRef.child(menu.suggestId).remove().then(()=>{
console.log(Object.assign({}, menu)) //line 63
delete menu.suggestId
console.log(Object.assign({}, menu)) //line 65
const newMenu = menu
console.log(Object.assign({}, menu)) //line 67
delete newMenu.restId
console.log(Object.assign({}, menu)) //line 69
console.log(Object.assign({}, newMenu)) //line 70
this.restaurantListRef.child(`${menu.restId}/menuList`).push(newMenu)
})
}
删除了restId
,但它显然也从newMenu
删除了restId
,我希望它不会删除来自menu
的{{1}},因为它应该是2个不同的变量吧?我尝试使用restId
,menu
或var
,但结果仍然相同。
请再次告知。谢谢!
答案 0 :(得分:1)
这是因为Chrome开发人员工具在您在控制台中打开它(单击箭头)之前不会评估该对象。执行console.log(obj)
时,它只会记录引用。尝试记录这个,它将起作用:
console.log(Object.assign({}, this.menu);
或
console.log(JSON.parse(JSON.stringify(this.menu));
或任何你喜欢的。代码执行同步,只是对chrome控制台内部对象的评估不是。
您也可以尝试仅记录console.log(this.menu.approvedBy)
而不是整个对象。你会看到它会像你期望的那样记录