如何解决NodeJs中的嵌套promise?

问题描述 投票:0回答:2

我正在使用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。

如何解决这个嵌套的promise?

javascript node.js promise node-fetch
2个回答
3
投票

由于

response.text()
返回一个 Promise,因此您必须等待它解析为文本,然后才能发回响应,否则它只会返回一个未解决的 Promise 作为
payload

  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
        }
      }
    }
© www.soinside.com 2019 - 2024. All rights reserved.