Как разрешить вложенное обещание в NodeJs? - PullRequest
0 голосов
/ 14 июня 2019

Я использую модуль 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 в вызывающей функции.

Как разрешить это вложенное обещание?

Ответы [ 2 ]

3 голосов
/ 14 июня 2019

Поскольку response.text() возвращает обещание, вам нужно дождаться, пока оно разрешится в текстовом формате, прежде чем отправлять ответ обратно, в противном случае он просто отправляет неразрешенное обещание как payload.

  return fetch(url,config)
    .then((response) => {
      return response.text().then(text => {
        return {
          status: response.status,
          payload: text
        }
      })
    })
2 голосов
/ 14 июня 2019

как response.text () вернуть обещание Использование async/await

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

Вы можете смешивать async/await и .then, но это не рекомендуется, потому что что-то не так с ожидающей-обещанием-цепочкой

чистый 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
        }
      }
    }
...