Próbuję uzyskać IP związany z instancją EC2. Jednak gdy próbuję uzyskać dostęp do zmiennej, nie istnieje w tym momencie. Jak uzyskać, aby najpierw pobrać IP przed wydrukowaniem?

const getIP = async () => {
  await ec2.describeInstances(params, (err, data) => {
    if (err) {
      return err
    }
    return data.Reservations[0].Instances[0].PublicIpAddress
  }).promise(); 
}

const ip = getIP();
console.log(ip);   // Returns null here

Muszę dzwonić do funkcji wielokrotnie w różnych miejscach, więc nie chcę umieścić zmiennej IP wewnątrz funkcji Async.

0
alcrakin39 14 kwiecień 2021, 09:46

3 odpowiedzi

Najlepsza odpowiedź

Aby rozwiązać ten problem, owinęłam funkcję w obietnicy.

function getIP(){
  return new Promise((resolve, reject) => {
ec2.describeInstances(params, (err, data) => {
    if (err) {
      reject(err)
    }
    resolve(data.Reservations[0].Instances[0].PublicIpAddress)
  })
}
}

const ip = await getIP()
0
alcrakin39 17 kwiecień 2021, 05:10

Użyj await podczas wywołania funkcji {x1}}:

const getIP = async () => ec2.describeInstances(params, (err, data) => {
    if (err) return err
    return data.Reservations[0].Instances[0].PublicIpAddress
  }).promise()

const ip = await getIP()
console.log(ip)
0
Miguel Mota 17 kwiecień 2021, 04:18

Spróbuj tego podejścia

const getIP = async () => {
  await ec2.describeInstances(params, (err, data) => {
    if (err) {
      return err
    }
    return data.Reservations[0].Instances[0].PublicIpAddress
  }).promise(); 
}

Ponieważ GETIP () to funkcja asynchroniczna, gdy Console.log jest nazywany, GETIP () jeszcze się nie skończył, więc IP jest nadal nie przypisany. Poniższy kod wywołuje Console.log po wykonaniu GEGIP ().

const show = async () => {
 const ip = await getIP();
 console.log(ip);
}
show();

Teraz możesz użyć funkcji Pokaż (), aby uzyskać IP lub zwrócić wartość IP w różnych miejscach, to samo można osiągnąć za pomocą zmiennej globalnej, ale nie jest zalecane

0
Jatin Mehrotra 17 kwiecień 2021, 04:14