【问题标题】:JS: Nested promises [duplicate]JS:嵌套承诺 [重复]
【发布时间】:2018-01-31 07:31:43
【问题描述】:

我不明白如何链接承诺:

getUser 是一个承诺函数,search 也是一个承诺函数。 getUser 将返回一个语言值。

此数据不是数组值,应由search函数返回

getUser(userId)
  .then(({ language }) => {
    const data = search('content', language)
    res.send(200, {
      content: data,
      user: { language }
    })
  })
  .catch((error) => next(error))

【问题讨论】:

  • 你不是已经问过这个问题并得到答案了吗?一个小时前?

标签: javascript promise


【解决方案1】:

为避免嵌套,您可以使用Promise.all:这将允许您通过链传递language 值:

getUser(userId)
    .then(({ language }) => 
        Promise.all([language, search('content', language)])
    ).then(([language, data]) => 
        res.send(200, {
            content: data,
            user: { language }
        })
    ).catch((error) => next(error))

【讨论】:

  • 投反对票的人能否解释一下这个答案有什么问题?
  • 不是反对者,但我很好奇你为什么在这里使用promise.all。语言是一种承诺吗?它看起来像 getUser 的返回值。为什么不能直接回复search()的承诺?
  • 当你只返回search() 承诺时,当res.send 被调用时你将无权访问language(在平链模型中)。注意:Promise.all 可以处理数组中的非承诺值。在这种情况下,它会将这些值视为立即解决的承诺。
  • 当然。谢谢。
  • 谢谢。我不明白,为什么这个答案被否决了......也不明白为什么这个问题被如此否定......
【解决方案2】:

如果search 返回一个promise,那么您需要使用.then() 来访问该promise 中的数据。并且你应该返回 Promise 以启用更高级别的链接:

getUser(userId)
  .then(({ language }) => {
    return search('content', language)
      .then((data) => {
        res.send(200, {
        content: data,
        user: { language }
      });
  })
  .catch((error) => next(error))

请注意,通常您可以通过返回 search() 返回的承诺来避免嵌套,然后链接另一个 .then() 调用,但是因为您试图从原始方法调用中捕获语言参数,所以您需要该值在范围内。 Trincot 的回答展示了如何捕获 language 的值以实现更好的链接。

【讨论】:

    猜你喜欢
    • 2016-09-08
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2019-05-22
    相关资源
    最近更新 更多