0

Как задать значение переменной ud внутри анонимной функции?

var ud = null;
  client.getUserDetails(function (error, data) {
    ud=data.skype; 
  });

    console.log(ud);

здесь ud равен null.

CodeGust
  • 1,834

1 Answers1

3

предполагаю, что в конкретном случае проблема в том, что client.getUserDetails выполняется асинхронно.

тогда заголовок(предлагаю заменить, используется для поиска) вопроса должен звучать так:

скоуп (scope) и асинхронные функции. асинхронный код

в таком случае console.log(ud); выполняется до того, как произойдёт присвоение переменной ud=data.skype;

иллюстрация проблемы

void function(){
 let c = null
 setTimeout(function() {
  c = 40
  console.log(`c2:${c}`);
 }, 1e3);
 setTimeout(function() {
  console.log(`c3:${c}`);
 }, 1e3+5);
 console.log(`c1:${c}`);
}()

способы решения

запустить таймер с большей длительностью

из разряда вредных советов, может сработать а может и нет

void function(){
 let c = null
 let doWithC = function(_c){
  console.log(`c:${_c}`);
 }
 setTimeout(function() {
  c = 40
  doWithC(c)
 }, 1e3);
}()

использовать Promise

void function () {
 let c = null
 new Promise((_rs, _rj) => {
  setTimeout(function () {
   c = 40
   _rs()
  }, 1e3)
 })
  .then(() => {
   console.log(`c:${c}`);
  })
  .catch(_e => console.log(_e))
}()

использовать Promise совместно с async/await для имитации синхронности

void async function () {
 let c = null
 await new Promise((_rs, _rj) => {
  setTimeout(function () {
   c = 40
   _rs()
  }, 1e3)
 })
 console.log(`c:${c}`);
}()

void async function () {
 let c = null
 c = await new Promise((_rs, _rj) => {
  setTimeout(function () {
   _rs(40)
  }, 1e3)
 })
 console.log(`c:${c}`);
}()

void async function () {
 let c = null
 c = await new Promise((_rs, _rj) => {
  setTimeout(function () {
   try {
    throw new TypeError('some error')
    _rs(40)
   } catch (error) {
    _rj(error)
   }
  }, 1e3)
 })
 .catch(_e => {
  console.log(_e)
  return null
 })
 console.log(`c:${c}`);
}()
qwabra
  • 4,962