【问题标题】:Unusual Typescript execution sequence - Angular/Ionic不寻常的打字稿执行顺序 - Angular/Ionic
【发布时间】:2018-09-25 19:05:10
【问题描述】:

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

这是我的构造函数的样子:

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

这是 console.log 结果:

为了确保页面加载后菜单值仍然相同,我在ionViewDidLoad() 的console.log - 第38 行,结果是相同的。您可以看到此时没有“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
  }

但是,在我执行该函数后,"approvedBy" 将在我放入菜单之前添加到菜单中。 大家可以参考下面的截图,console.log的顺序是对的,但是第52行和第54行console.log应该没有"approvedBy"吧?它应该只出现在第 57 行,因为 "approvedBy" 在第 56 行添加到 menu

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

已编辑

感谢 PierreDuc 解决了我的问题。

之后,使用相同的功能,它调用我的提供程序来更新我的数据库。这里是approveMenu()的扩展

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')
      })
  }

当我调用restaurantProvider 的approvePendingMenu(this.menu) 函数时,有些代码没有按照我的预期处理。我先给你看approvePendingMenu(this.menu)

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)       
      }) 
  }

在第 98 行,我从newMenu 中删除了restId,但它显然也从menu 中删除了restId,我希望它不会从menu 中删除restId因为它应该是 2 个不同的变量,对吧?我尝试使用varletconst,但结果还是一样。

特此附上console.log截图供大家参考:

请再指教。谢谢!

【问题讨论】:

标签: angular typescript ionic-framework


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

【讨论】:

  • 非常感谢!它确实解决了我的问题。但是我来这里是关于处理对象的第二个问题,我已经编辑了我的问题,你也可以帮忙。
  • 当您执行const newMenu = menu; 时,您不会创建新对象。您只需将引用(对内存中某个对象的引用)复制到保存在菜单变量中的对象到 newMenu 常量。因为你有一个浅对象,你可以使用相同的Object.assign技巧:const newMenu = Object.assign({}, this.menu)。这会创建一个新对象,newMenu 和 menu 变量会有不同的引用
猜你喜欢
  • 1970-01-01
  • 2015-11-26
  • 2022-08-18
  • 2019-01-21
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
相关资源
最近更新 更多