request ładowanie i zwracanie jsona

0

Hej, mam sobie taki kodzik:

function getOrderBook()
{
  request("https://jakasstrona/rbook.json", function (err, res, body){
    if(!err){
      var b = JSON.parse(body);
      return b;
      //return JSON.parse(body);
    }
    else
      console.log("Error with request json: " + err);
  });
}

var orders = getOrderBook();
console.dir(orders);

no i teraz zwraca mi undefined. Pewnie dlatego ze plik jeszcze sie nie zdazyl zaladowac. W actionscript mialem sobie listenery ktore nasluchiwaly koniec ladowania i wtedy mialem dostep do
zaladowanej tresci. Pewnie moge napisac

request("https://jakasstrona/rbook.json", function (err, res, body){
    if(!err){
      var b = JSON.parse(body);
      read(b);
      //return JSON.parse(body);
    }

function read(json)
{
      //tutaj odczytam jsona
}

Jednak lepiej jest zwrocic returnem zaladowany obiekt. Tyle ze nie wiem czy w nodejs sa jakies listenery :> Jak to ugryzc?

0

wyswietlic te dane musisz w callbacku, wiesz jak dzialaja asychroniczne żadania?

0

wiem, a przynajmniej tak mi sie wydaje :> Callback w tym wypadku to moja hipotetyczna metoda read.
Tu mi jednak bardziej pasuje ladowanie synchroniczne, tylko chyba nie moge w takim wypadku skorzystać z modułu request tylko jakiegos innego synchronicznego:>

Dlaczego synchronicznie? poniewaz owy json bedzie czesto odswiezany i wazne jest aby pozostaly kod sie wykonywal później:>
A wydaje mi sie lepszym pomyslem skorzystac z metody ktora od razu zwraca jakas konkretna wartosc na zadanie dowolnej innej metody niz "wywolywanie" pozostalego kodu przez jakas metode getOrder ktora moim zdaniem powinna tylko i wylacznie zwracac jakis order a nie wywolywac jeszcze inne metody poniewaz to moze prowadzic do nieprzewidywalnych bledow.

EDIT
Chociaz w sumie po zastanowieniu sie w AS3 nie moglbym zrobic inaczej jak tylko ograniczyc pozostaly kod do uruchomienia sie po skonczeniu ladowania:>
Tyle ze tam moim zdaniem byloby to ladniej ubrane, w innych miejscach bylyby listenery na koniec ladowania a metoda getOrder zwracalaby tylko konkretny zaladowany odrder i nic innego by nie robila:>

1

To musi być asynchroniczne, jak nie chcesz przekazywać callbacków do samej metody to zwróć z niej promise'a.

Coś w stylu:

function getOrderBook() {
  return new Promise((resolve, reject) => {
    request("https://jakasstrona/rbook.json", function (err, res, body){
      if (!err){
        resolve(JSON.parse(body))
      } else {
        reject(err)
      }
    })
  })
}

// Usage (standard):

function someFunctionA () {
  const result = getOrderBook()
  
  result
    .then(console.log)
}

// Usage (with async-await):

async function someFunctionB () {
  const result = await getOrderBook()
  
  console.log(result)
}

Możesz też zamiast request użyć jakiegoś klienta domyślnie zwracającego promisy (superagent, axios, node-fetch itp)

0

kurcze nie doczytalem twojej odpowiedzi po kopaniu znalazlem rozwiazanie swoja droga na youtub jest fajny filmik fun fun functions await in javascript:>

Robie w stylu:

async function isAskFirst()
{
  var result = await callAPI({
    method: 'orders',
  })

.......................

{
        
          if(a <= b)
          {
            return new Promise((resolve, reject) => {
              resolve(true)
             // return true;
            })
          }
          else
          {
             return new Promise((resolve, reject) => {
              resolve(false)
              //  return false;
            })
          }

a w wywolaniu :

isAskFirst().then(result => {
  console.log(result);
})

Wywoluje przez then ponieważ nie chcialem zaznaczac metody w ktorej to wywoluje jako async ale chyba powinienem i zaczekac awaitem a nie then skoro juz uzywam tego asynca:>

Chcialem napisac inna metode tym 2gim sposobem ale zwraca mi Promise <undefined> przy czym jak nie zaznacze metody isFirst jako async to wywala cannot read property then :>

async function isFirst()
{
  callAPI({
    method: 'orders',
  })
    .then(result => {
      for(let i = 0; i < result.length; i++)
      {
        if(result[i].type == "accept")
        {
          let myVal = result[i].current_val / result[i].units;
          if(myVal >= oldVal)
          {
            return new Promise((resolve, reject) =>
            {
                resolve(true);
            })
          }
            //return true;
          else
          {
            return new Promise((resolve, reject) =>
            {
                resolve(false);
            })
          }
           // return false;
        }
      }
    })

}

a wywolanie:

const result = isBidFirst()
  result
        .then(console.log(result));

Czyli metoda pierwsza z then ale cosik nie dziala tak jak await:/

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