【问题标题】:Reuse object literals created via destructuring重用通过解构创建的对象字面量
【发布时间】:2017-11-12 03:42:54
【问题描述】:

我正在尝试为两个异步调用重用对象字面量。最后,我的期望应该检查 deleteBucket 调用是否成功。问题是我不能这样做,或者它说我已经定义了 dup 变量:

it('can delete a bucket', async () => {
      const options = { branch: '11' }

      let { failure, success, payload } = await deployApi.createBucket(options)
      let { failure, success, payload} = await deployApi.deleteBucket(options.branch)

      expect(success).to.be.true
    })

有人告诉我,我可以在第二个周围加上 (),但这给了我一个 TypeError: (0 , _context4.t0) is not a function 错误:

it('can delete a bucket', async () => {
  const options = { branch: '11' }

  let { failure, success, payload } = await deployApi.createBucket(options)

  ({ failure, success, payload} = await deployApi.deleteBucket(options.branch))

  expect(success).to.be.true
})

这确实有效,但需要我更改我不想做的已解析对象的名称:

it('can delete a bucket', async () => {
      const options = { branch: '11' }

      let { failure, success, payload } = await deployApi.createBucket(options)
      let { failure1, success1, payload1} = await deployApi.deleteBucket(options.branch)

      expect(success1).to.be.true
    })

更新:

有人建议我在 const 行之后需要一个分号。没有任何区别,我运行时仍然遇到同样的错误:

【问题讨论】:

  • 我看到你的更新,包括截图。你能更仔细地阅读我的答案吗?它准确地显示了您需要放置分号的位置。您的屏幕截图在错误(不必要的)位置显示了一个分号
  • 仅供参考,async/await 不是 ES6 (ES2015) 的一部分。它是今年发布的 ES2017 的一部分。

标签: javascript asynchronous async-await ecmascript-2017


【解决方案1】:

您不必更改名称。您的程序中的其他地方可能有问题

let {x,y,z} = {x: 1, y: 2, z: 3};

console.log(x,y,z);
// 1 2 3

({x,y,z} = {x: 10, y: 20, z: 30});

console.log(x,y,z);
// 10 20 30

哦,我明白了,你少了一个分号!

这解释了您所看到的“TypeError:(0 , _context4.t0) 不是一个函数”——在这里您无能为力;我知道分号很糟糕,但在这种特定情况下您必须使用分号。

// missing semicolon after this line!
let { failure, success, payload } = await deployApi.createBucket(options); // add semicolon here!

// without the semicolon, it tries to call the above line as a function
({ failure, success, payload} = await deployApi.deleteBucket(options.branch))

“没有区别”

是的,确实如此;尝试运行与我上面完全相同的代码 sn-p,但没有分号 - 你会认出熟悉的 TypeError

let {x,y,z} = {x: 1, y: 2, z: 3}

console.log(x,y,z)
// 1 2 3

({x,y,z} = {x: 10, y: 20, z: 30})
// Uncaught TypeError: console.log(...) is not a function

console.log(x,y,z)

【讨论】:

  • @PositiveGuy 找到了它;你错过了一个重要的分号
  • 在let 行,如我的帖子中所示和评论
  • 是的,那么您的 linter/预处理器配置有问题 - 这是 100% 的自动分号插入 (ASI) 问题。查看我的更新答案,了解我是如何重现问题的。
  • @PositiveGuy:您必须在第一个 await 调用之后放置分号,而不是 const。 foo() <line break> (whatever here) 被解释为foo()(whatever here),即两个函数调用。您在 {...} = ... 赋值周围放置的括号不会被解释为分组运算符,而是作为函数调用({} = ... 是传递给调用的参数)。分号很重要。如果你只是一直使用它们,你就不会遇到这个问题;)
  • 啊,好的,你是对的,我试图把它放在错误的位置,抱歉我没有读,漫长的夜晚。非常感谢您的帮助!
猜你喜欢
  • 2012-03-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2017-01-09
相关资源
最近更新 更多