【问题标题】:How to resolve nested promise in NodeJs?如何解决 NodeJs 中的嵌套承诺?
【发布时间】:2019-10-28 15:47:41
【问题描述】:

我正在使用 node-fetch 模块进行 API 调用。我有一个可以进行所有 API 调用的函数。从这个函数中,我返回状态码和响应体。以下代码导致正文为空 -

function makeRequest (url,config) {

  return fetch(url,config)
  .then( (response) => {
    return {
      "status" : response.status,
      "payload": response.text()
    }
  })
  .catch( (error)=>  {
    console.log(error)
    return {
      "status": null,
      "payload" : error.message
    }
  })
}

async function getDestinationToken() {


  const config = {
    method : "POST",
    headers: {
      'Authorization': 'Basic ' + Buffer.from(sDestCredentials).toString('base64')
    },
    body : data
  }

  const url = uaa_service.credentials.url 

  console.log('Getting access Token')

  let response = await makeRequest(url,config)
  console.log("Response from token "+ response)
}

getDestinationToken()

据我了解, response.text() 返回一个承诺。在 getDestinationToken() 我正在等待它完成。那么,为什么它不起作用?它改为打印一个空正文,如下所示 -

       {
          "status" : 200,
          "payload": {}
        }

但是,如果我不从函数返回对象,如下所示,代码似乎可以工作。

function makeRequest (url,config) {

  return fetch(url,config)
  .then( (response) => {
    return response.text()
  })
  .catch( (error)=>  {
    console.log(error)
    return {
      "status": null,
      "payload" : error.message
    }
  })
}

在上述情况下,我可以看到响应负载。但是,我不能使用上述方法,因为我在调用函数中也需要 response.status。

如何解决这个嵌套的承诺?

【问题讨论】:

    标签: javascript node.js promise fetch node-fetch


    【解决方案1】:

    由于response.text() 返回一个promise,您必须等待它解析为文本,然后再发回响应,否则它只会以payload 的形式返回一个未解析的promise。

      return fetch(url,config)
        .then((response) => {
          return response.text().then(text => {
            return {
              status: response.status,
              payload: text
            }
          })
        })
    

    【讨论】:

      【解决方案2】:

      作为 response.text() 返回承诺 使用async/await

          return fetch(url,config)
            .then( async (response) => {
              return {
                "status" : response.status,
                "payload": await response.text()
              }
            })
      

      async/await.then 可以混用,但不推荐,因为whats-wrong-with-awaiting-a-promise-chain

      async/await

          async function makeRequest (url,config) {
            try{
              const response= await fetch(url,config)
              return{
                "status" : response.status,
                "payload": await response.text()
              }
            }
            catch(error) {
              console.log(error)
              return {
                "status": null,
                "payload" : error.message
              }
            }
          }
      

      【讨论】:

      • 混合.then()async/await 被认为是不好的做法。最好完全使用其中一种。
      • 为什么这是一种不好的做法
      • 可读性/可维护性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 2017-04-04
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      相关资源
      最近更新 更多