Проблема с использованием обещаний JS ES6 в React - TypeError: Невозможно прочитать свойство then для неопределенного - PullRequest
0 голосов
/ 05 ноября 2018

Я импортирую функцию getWeather из другого файла .js, который я написал. Результатом является BLOB-объект JSON. Я проверил, что я возвращаю BLOB-объект JSON, но когда я пытаюсь вызвать функцию getWeather и использовать .then для ожидания ответа и установки своего состояния, я получаю TypeError.

getWeather(parseFloat(lat),parseFloat(long)).then((data) =>{
  this.setState({weatherType: data.currently.icon, temp: data.currently.temperature})
  return data
}).catch((error) => {
  console.log(error.message);
})

Функция getWeather здесь:

export function getWeather(lat,long) {
  const params = {
    headers: {
      "content-type": "application/json; charset=UTF-8",
      "Access-Control-Allow-Origin": "*"
    },
    method: "GET"
      };
      fetch(`https://api.com/mykey/${lat},${long}`, params)
        .then(function (data) {
          return data.json();
        })
        .then(res => {
          console.log(res);
        })
        .catch(error => {
          console.log(error);
        });
    }

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Вам нужно return fetch(), чтобы сделать обещание доступным из другой функции. Кроме того, я, вероятно, обработал бы ведение журнала и ошибки в вызывающей функции, как если бы вы регистрировали данные, вы больше не возвращали их.

export function getWeather(lat,long) {
  const params = {
    headers: {
      "content-type": "application/json; charset=UTF-8",
      "Access-Control-Allow-Origin": "*"
    },
    method: "GET"
      };
      return fetch(`https://api.com/mykey/${lat},${long}`, params)
        .then(function (data) {
          if (!data.ok) { return new Error('custom error message here') }
          return data.json();
        });
    }
0 голосов
/ 05 ноября 2018

Скорее всего, вы вернете этот BLOB-объект из функции getWeather без создания Promise. Попробуйте что-то вроде этого:

function getWeather() {
// create blob as usual
  return Promise.resolve(blob);
}

или, если вы уже внутри a, вы должны просто что-то оттуда повторить:

      fetch(`https://api.com/mykey/${lat},${long}`, params)
        .then(function (data) {
          return data.json();
        })
        .then(res => {
          console.log(res);

          retrun res; // return something 

        })
        .catch(error => {
          console.log(error);
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...