Функция Asyn c возвращает обещание. Как сделать значение обещания глобальным? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть функция asyn c, которая возвращает обещание. Я не понимаю, как получить доступ к значению Promise. Я наткнулся на .then(). Он работает с .then(), но я хочу сделать обещание глобальным. Что невозможно, если я использую .then().

Вот мой код:

async function getUser() {  
  try {    
    response = await axios.post('/',data);  
  } 
  catch (error) {   
    console.error(error);  
  }  
  return response.data;
}

var global = getUser(); 
console.log(global);

Этот код здесь возвращает обещание примерно так:

screenshot function return value

Мне интересно, как я могу получить доступ к значению Promise (которое мы видим на изображении) и сделать его глобальным? Я новичок в JavaScript, не в состоянии обернуть голову вокруг асин c функций.

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Вы не можете. Использование async означает, что ваша функция на самом деле заключает в себе обещание. Так что global в var global = getUser() - это обещание. Вы можете либо ожидать в asyn c функции , либо использовать .then().

Если вы хотите, чтобы код выглядел синхронно, вы могли бы иметь основную функцию и просто вызвать main 'глобально':

async function main() {
   // because main is an async function, it can unwrap the promise
   const user = await getUser();
   console.log({user});
}

main();

Вы не должны пытаться используйте user «глобально» и используйте его только в main. Это потому, что обещание getUser может даже не быть выполнено, так что это будет нерешенное обещание. Вы должны использовать его только тогда, когда вы явно ожидали (await или then 'd) обещания. Кроме того, глобальные переменные не очень хороши на любом языке программирования, включая javascript.

0 голосов
/ 21 апреля 2020

Вы можете установить значение global следующим образом:

var global;
getUser().then(user => global = user);

function getUser() {
  return Promise.resolve("User #1");
}

var global;
getUser().then(user => global = user);

console.log("1", global);
setTimeout(() => console.log("2", global), 500);

Однако имейте в виду, что другой синхронный код не знает, когда установлена ​​переменная global. Значение будет undefined, пока не будет вызван обратный вызов. Лучшим вариантом может быть то, что вы уже делаете:

var global = getUser();

Таким образом, другой синхронный код может присоединить обратные вызовы, выполнив:

global.then(user => {
  // ...
});

function getUser() {
  return Promise.resolve("User #1");
}

var global = getUser();

global.then(user => console.log("1", user));
setTimeout(() => {
  global.then(user => console.log("2", user));
}, 500);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...