不寻常的Typescript执行序列 - 角度/离子

时间:2018-04-16 06:07:53

标签: angular typescript ionic-framework

我面临一个非常奇怪的情况。在第1行代码之前执行的第2 /第3行代码,我不认为代码是异步的。

以下是我的构造函数的样子:

this.menu = this.navParams.get('menu')
console.log(this.menu) //code line 31

这是console.log结果: enter image description here

为了确保在加载页面后菜单值仍然相同,我在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"

enter image description here

但显然它没有按预期工作,请赐教。

被修改

感谢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个不同的变量吧?我尝试使用restIdmenuvar,但结果仍然相同。

特此附上console.log截图供您参考: enter image description here

请再次告知。谢谢!

1 个答案:

答案 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)而不是整个对象。你会看到它会像你期望的那样记录