Jak przypisać wynik promise'a do zmiennej?

0

Cześć!

Potrzebuję pomocy. Dla jasności, coś tam w życiu programowałem, ale nie znam JS. Potrzebuję drobnego sterowanie na karcie muzycznej. Testowałem z curl w bash'u i drobny skrypt robi co chcę, ale potrzebuję wersji w JS. Próbowałem sam, ale nie mogę przebrnąć jednego elementu. Do rzeczy.

Oto kod:

async function doRequest() {
  let url = "http://10.1.1.11/datastore/mix/talkback/enable";
  let res = await fetch(url);
  if (res.ok) {
    const text = await res.text();
    return text; // text przyjmuje wartość {"value":0} lub {"value":1}
  } 
  else {
    return `HTTP error: ${res.status}`;
  }
}

let a = doRequest().then((data) => {
  console.log(data);
});

Mój problem polega przypisaniu zmiennej a
W takiej postaci jak teraz a przyjmuje wartość:

Promise {[[PromiseState]]: 'pending', [[PromiseResult]]: undefined, Symbol(async_id_symbol): 39, Symbol(trigger_async_id_symbol): 5}

Problem rozwiązałem ale wydaje mi się mało elegancki.

async function doRequest() {
  let url = "http://10.1.1.11/datastore/mix/talkback/enable";
  let res = await fetch(url);
  if (res.ok) {
    const text = await res.text();
    return text;
  } else {
    return `HTTP error: ${res.status}`;
  }
}

doRequest().then((data) => {
  const b = '{"value":1}';
  // console.log(data);
  if (data == b) {
    fetch("http://10.1.1.11/datastore", {
      method: "POST",
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
      },
      body: 'json={"mix/talkback/enable":0}',
    });
  } else {
    fetch("http://10.1.1.11/datastore", {
      method: "POST",
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
      },
      body: 'json={"mix/talkback/enable":1}',
    });
  }
});

Jak uzyskać odpowiedź serwera do dalszego przetwarzania w programie? Czyli jak zrobić żeby a przyjęło wartość zwracana z serwera {"value":0} lub {"value":1}?

Mam nadzieję, że się wyraziłem jasno.

1

Generalnie to tak się to robi. Ewentualnie dałbym returny przed tymi fetchami dla porządku.

Możesz też zrobić coś takiego:
let a = await doRequest()

Ale to raczej nie działa domyślnie w Node.js, trzeba jakąś flagę przestawić.

Tutaj więcej: https://www.stefanjudis.com/today-i-learned/top-level-await-is-available-in-node-js-modules/

1

No, ogólnie to co próbujesz zrobić jest trochę średnio dobre, bo próbujesz mieć zmienną top-level a, która ma ustawioną wartość z Promisea, i takich rzeczy się ogólnie nie robi. @szatkus1 napisał że można to obejść poprzez top-level await, ale to raczej nie jest standardowa praktyka.

Ja bym to zrobił tak:

async function request() {
  const response = await fetch("http://10.1.1.11/datastore/mix/talkback/enable");
  if (response.ok) {
    return await response.json();
  } 
  return `HTTP error: ${res.status}`;
}

async function main() {
  const a = await doRequest();
}

main();
0
szatkus1 napisał(a):

Generalnie to tak się to robi. Ewentualnie dałbym returny przed tymi fetchami dla porządku.

Możesz też zrobić coś takiego:
let a = await doRequest()

Ale to raczej nie działa domyślnie w Node.js, trzeba jakąś flagę przestawić.

Tutaj więcej: https://www.stefanjudis.com/today-i-learned/top-level-await-is-available-in-node-js-modules/

Znalazłem to rozwiązanie, ale faktycznie u mnie nie działało.

Riddle napisał(a):

No, ogólnie to co próbujesz zrobić jest trochę średnio dobre, bo próbujesz mieć zmienną top-level a, która ma ustawioną wartość z Promisea, i takich rzeczy się ogólnie nie robi. @szatkus1 napisał że można to obejść poprzez top-level await, ale to raczej nie jest standardowa praktyka.

Ja bym to zrobił tak:

async function request() {
  const response = await fetch("http://10.1.1.11/datastore/mix/talkback/enable");
  if (response.ok) {
    return await response.json();
  } 
  return `HTTP error: ${res.status}`;
}

async main() {
  const a = await doRequest();
}

main();

Chyba zaczynam rozumieć o co biega. Dalej chyba powinienem sobie poradzić. Jeszcze krótszy kod? Nieźle! Czapki z głów :)

1
Riddle napisał(a):
async main() {
  const a = await doRequest();
}

main();

Wygląda, że async main() jest niepoprawny bez function...

0
msterna napisał(a):
Riddle napisał(a):
async main() {
  const a = await doRequest();
}

main();

Wygląda, że async main() jest niepoprawny bez function...

Dokładnie. Zapomniałem napisać, powinno być z function.

1 użytkowników online, w tym zalogowanych: 0, gości: 1