JS:嵌套的承诺

时间:2017-08-22 21:36:24

标签: javascript promise

我不明白如何连接承诺:

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

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

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

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

如果search返回一个承诺,那么您需要使用.then()来访问该承诺中的数据。你应该返回承诺,以便在更高层次上进行链接:

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的值以获得更好的链接。