Почему «Обещание {<pending>}» не разрешается? - PullRequest
3 голосов
/ 07 апреля 2019

Я пытаюсь получить данные из API Storm Glass. Я использую их шаблон запроса Fetch (https://docs.stormglass.io/?javascript#point-request).

Когда я запускаю скрипт, консоль бесконечно считывает «Promise { <pending> }». Итак, запрос не возвращает значение, но я не могу понять, почему. Есть идеи?

Я заменил свой ключ API на <My API key>

const http = require('http')
const fetch = require('isomorphic-fetch');

http.createServer((req, res) => {

////////////////////////////////////////////////App code
const lat = 58.7984;
const lng = 17.8081;
const params = 'waveHeight,airTemperature';

fetch(`https://api.stormglass.io/point?lat=${lat}&lng=${lng}&params=${params}`, {
  headers: {
    'Authorization': '<My API key>'
  }
}).then(function(response) {
  // Do something with response data.
  const jsonData = response.json();
  console.log(jsonData)
});

/////////////////////////////////////////////////////////
}).listen(3000);

console.log("service running on http://localhost:3000");

Ответы [ 2 ]

5 голосов
/ 07 апреля 2019

Функция response.json возвращает Обещание, а не десериализованный объект. Ваш код должен читать:

fetch(`https://api.stormglass.io/point?lat=${lat}&lng=${lng}&params=${params}`, {
  headers: {
    'Authorization': '<My API key>'
  }
})
.then(response => response.json())
.then(function(jsonData) {
  // Do something with response data
  console.log(jsonData)
});
1 голос
/ 07 апреля 2019

В дополнение к ответу gretro, вы, возможно, поняли, что const json = response.json() будет работать, если смотреть на код async/await, так как он очень похож, поэтому вот как этот код может выглядеть, если он написан таким образом. Он традиционно заключен в try/catch, поэтому я тоже включил его.

http.createServer(async (req, res) => {

  const lat = 58.7984;
  const lng = 17.8081;
  const params = 'waveHeight,airTemperature';

  try {
    const endpoint = `https://api.stormglass.io/point?lat=${lat}&lng=${lng}&params=${params}`;
    const params = { headers: { 'Authorization': '<My API key>' } };
    const response = await fetch(endpoint, params);
    const jsonData = await response.json();
    console.log(jsonData);
  } catch (err) {
    console.error(err);
  }

}).listen(3000);
...