【问题标题】:JS Promises: Relationship between .then syntax and async/await (Apollo client example)JS Promises:.then 语法和 async/await 之间的关系(Apollo 客户端示例)
【发布时间】:2019-10-06 07:15:54
【问题描述】:

抱歉问题格式不好,但我不知道这里出了什么问题:我正在将 JWT 令牌附加到 Apollo 客户端(使用 apollo-boost),如下所示:

const client = new ApolloClient({
  uri: 'http://127.0.0.1:3000/graphql',
  // adding the auth header to all requests
  request: async operation => {
    try {
      const session = await Auth.currentSession()
      const token = session.accessToken.jwtToken
      operation.setContext({
        headers: {
          authorization: `Bearer ${token}`
        }
      })
    } catch(e) {
      return
    }
  }
})

这行得通。但是,当我尝试将其转换为我更喜欢的 .then 语法时,它不再起作用了。这就是我重写它的方式:

  request: operation => {
    Auth.currentSession().then(session => {
      const token = session.accessToken.jwtToken
      operation.setContext({
        headers: {
          authorization: `Bearer ${token}`
        }
      })
    }).catch(err => {
      return
    })
  }

我错过了什么?

【问题讨论】:

  • 如果你希望它被调用者链接/等待,你需要 return 承诺。
  • it didn't work anymore,什么不再起作用了?以及如何不再工作?`

标签: javascript async-await es6-promise apollo


【解决方案1】:

async/await 语法更好,尝试继续使用它。如果您必须针对较旧的浏览器,我建议您在编译管道中引入转译器,而不是手动将其重写为 vanilla javascript。如果您仍然对“then”语法感兴趣,那么您就是:promise 需要由函数返回。

request: operation => {
    return Auth.currentSession().then(session => {
       ... 
    }).catch(err => {
      return
    })
}

【讨论】:

  • async/await 看起来更干净,但它会在编译时引入很多额外的包袱,因此有时不推荐使用。见herenpmjs.com/package/babel-preset-airbnb (async/await: regenerator-runtime is too heavyweight for our use, and async-to-promises is not yet complete enough to be safely used.)
  • 我觉得它有时看起来也有误导性。不太清楚有异步代码正在运行以及它是如何运行的。但是在这个例子中,.then 语法有点奇怪。不管怎样,现在我想了想,你必须回来是有道理的。谢谢!
  • @CertainPerformance 我明白你的意思,尽管我从未见过一个项目中这是最紧迫的性能问题。此外,我宁愿将其视为缺乏良好的工具。我希望 Kneden 起飞...github.com/babel/kneden
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 2019-04-15
  • 2015-02-13
  • 2020-09-16
  • 1970-01-01
相关资源
最近更新 更多