Как поместить запрос на выборку внутри функции и дождаться возвращаемого значения, когда я вызываю функцию - PullRequest
0 голосов
/ 13 июля 2020

Я использую response-native, mon go DB и node js, и мне нужно создать некоторые функции базы данных и поместить их в некоторые модули, чтобы иметь возможность повторно использовать их в любое время. Чтобы получить данные из базы данных mon go, я использую функцию fetch(), которая возвращает обещание. Итак, для всех созданных мною функций, которые не возвращали значение, я использовал .then и не столкнулся с проблемами. С другой стороны, когда я возвращаю значение внутри функции fetch().then() и использую это возвращаемое значение, я получаю undefined. Код, который я использую для функции, выглядит так:

export const getUsers = () => {
  //I cannot use this function because of returning a promise
  fetch("http://1jjsd12zaws.ngrok.io/database/", {
    method: "GET",
    headers: {
      "Content-Type": "application/json",
    },
  })
    .then((res) => {
      res.json();
    })
    .then((data) => {
      return JSON.stringify(data);
    });
};

Затем, когда я пытаюсь запустить этот код:

let users=getUsers();
console.log(users);

Он печатает undefined.

Я думаю, что происходит то, что console.log(users) запускается до того, как getUsers() вернет свое значение. Но я не знаю, почему это происходит, и я хочу, чтобы он дождался выполнения getUsers(), а затем завершил свою работу.

Ответы [ 2 ]

1 голос
/ 13 июля 2020
  • Вам нужно вернуть fetch(..) внутри getUsers (поэтому вы получаете undefined)
  • Также вам нужно вернуть res.json() внутри первого then
  • Поскольку getUsers возвращает обещание, вам нужно использовать .then (или async/await) для доступа к значению обещания: getUsers().then(users => {...})

const getUsers = () => {
  return fetch('http://1jjsd12zaws.ngrok.io/database/', {
    method: 'GET',
    headers: {
      'Content-Type': 'application/json'
    }
  })
    .then(res => {
      return res.json();
    })
    .then(data => {
      return JSON.stringify(data);
    });
};

getUsers().then(users => console.log(users))
0 голосов
/ 13 июля 2020

Asyn c и await должны покрыть его. Пример в MDN docs объясняет это лучше, чем я могу, и должен применяться к вашему варианту использования.

...