Как добиться естественного разрешения обещания с помощью request-prom-native

Я использую модуль request-promise-native на node.js. API, который я вызываю, возвращает необходимые данные через GET. Это прекрасно работает.

Однако, когда я пытаюсь получить данные из функции, которая, поскольку ей предшествует Async, возвращает обещание, я просто не могу правильно понять синтаксис. Вот что я пробовал:

const request = require('request-promise-native');

async function usdToEos () {
  const options = {
    method: 'GET'
    ,uri: 'https://api.coincap.io/v2/assets/eos'
    ,json: true
  }
  const response = await request(options)
    .then(response => {
      console.log(response)
      return (1 / response.data.priceUsd)
    })
    .catch(error => {
      console.log('\nCaught exception: ' + error);
    })
}

var usdToEosMul = usdToEos()
console.log('\n' + 'USD multiplier to convert to EOS' + '\n')
console.log(usdToEosMul)

Как мне получить возвращаемое значение ... данные ... (1 / response.data.priceUsd). Это видно в ... console.log (ответ) ... но не в переменной usdToEosMul.


person Knowself    schedule 01.03.2019    source источник
comment
функция ничего не возвращает. при использовании asyc / await вам не нужно обещать   -  person Bonjov    schedule 01.03.2019
comment
@Daviti Как бы вы исправить этот код?   -  person Knowself    schedule 01.03.2019


Ответы (1)


функция, которая, поскольку ей предшествует async, возвращает обещание

Похоже, вы уже почти ответили на свой вопрос. Вам придется дождаться этого обещания на своем сайте звонков:

usdToEos().then(usdToEosMul => {
  console.log('\n' + 'USD multiplier to convert to EOS' + '\n')
  console.log(usdToEosMul)
}).catch(error => {
  console.log('\nCaught exception: ' + error)
})

function usdToEos() {
  const options = {
    method: 'GET'
    ,uri: 'https://api.coincap.io/v2/assets/eos'
    ,json: true
  }
  return request(options).then(response => {
    console.log(response)
    return (1 / response.data.priceUsd)
  })
}

or

;(async function() {
  try {
    const usdToEosMul = await usdToEos()
    console.log('\n' + 'USD multiplier to convert to EOS' + '\n')
    console.log(usdToEosMul)
  } catch(error) {
    console.log('\nCaught exception: ' + error)
  }
}())

async function usdToEos() {
  const options = {
    method: 'GET'
    ,uri: 'https://api.coincap.io/v2/assets/eos'
    ,json: true
  }
  const response = await request(options)
  console.log(response)
  return (1 / response.data.priceUsd)
}
person Bergi    schedule 01.03.2019
comment
Должен ли я ? ... Я бы предпочел, чтобы вызывающий ... мой клиент ... не беспокоился об асинхронности и просто получил номер или исключение. - person Knowself; 01.03.2019
comment
@Knowself Да, ты должен. Невозможно синхронно выдать асинхронный результат. - person Bergi; 01.03.2019
comment
@Bergi. Вы можете снова превратить асинхронную функцию в синхронную, но это включает в себя блокировку цикла событий до тех пор, пока обещание не будет выполнено или отклонено. Это ужасная идея. - person 3limin4t0r; 01.03.2019
comment
@ 3limin4t0r Нет, нельзя. Блокировка цикла событий будет означать, что обещание никогда не выполняется. - person Bergi; 01.03.2019