Javascript: return een array uit een function

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • argon007
  • Registratie: April 2011
  • Laatst online: 12:26
Hallo,

Ik ben wat bezig met scriptjes te maken voor CryptoTrading. Ik ben geen programmeur en zoek dus uren rond op google om bij te leren en om te bekomen wat ik wil bekomen. Ik zit hier echter vast en weet niet hoe ik hier net verder moet. Onderstaande is een .js file met 1 functie in. Die functie vraagt alle mogelijk te traden munten op bij Binance. Daar ik meerdere scripts heb die deze info nodig heeft had ik dit graag aangeroepen vanuit de andere scripts.


pairs.js
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
const Binance = require('node-binance-api');
const binance = new Binance().options({
    APIKEY: '<key>',
    APISECRET: '<secret>',
    useServerTime: true, // If you get timestamp errors, synchronize to server time at startup
    test: true // If you want to use sandbox mode where orders are simulated
});

var pairsinfo = [];

module.exports = {
    initExchangeInfo: function (next) {
        binance.exchangeInfo(function (error, data) {
            if (data.symbols) {
                for (var obj of data.symbols) {
                    var filters = { status: obj.status }
                    for (var filter of obj.filters) {
                        if (filter.filterType == "MIN_NOTIONAL") {
                            filters.minNotional = filter.minNotional
                        }
                        else if (filter.filterType == "PRICE_FILTER") {
                            filters.minPrice = filter.minPrice
                            filters.maxPrice = filter.maxPrice
                            filters.tickSize = filter.tickSize
                        }
                        else if (filter.filterType == "LOT_SIZE") {
                            filters.stepSize = filter.stepSize
                            filters.minQty = filter.minQty
                            filters.maxQty = filter.maxQty
                        }
                    }
                    filters.orderTypes = obj.orderTypes
                    filters.icebergAllowed = obj.icebergAllowed

                    object = new Object();

                    object.pair = obj.symbol
                    object.tokenname = obj.baseAsset
                    object.marketname = obj.quoteAsset
                    object.minqty = filters.minQty
                    object.minnotional = filters.minNotional
                    object.status = filters.status
                    pairsinfo.push(object);
                }
                pairsinfo = pairsinfo.reduce((p, c) => (c.status !== "BREAK" && p.push(c), p), []);
                //console.table(pairsinfo);
            }
            next(error)
        })
    }
}


Als ik een console.table(pairsinfo) doe van bovenstaand script dan bekom ik het volgende:
Afbeeldingslocatie: https://cdn.discordapp.com/attachments/654236086838755340/676850028878364712/unknown.png

Hoe kan ik deze volledige array nu aanroepen en gebruiken in mijn andere scripts? Ik moet toegeven dat ik bovenstaande vooral heb gecopy/past van de persoon die deze Binance Wrapper heeft gemaakt. Ik snap bijgevolg ook niet onmiddellijk wat die "next(error)" wil zeggen.

Ik begin stilaan wat mijn weg te vinden in javascript (basis wel :-) ) maar ik geraak er dus maar niet uit aan die Functions. Ik zie mezelf hier nergens een "return" meegeven en ik heb zo'n vermoeden dat het daar al fout kan zitten.

Alvast bedankt!

Beste antwoord (via argon007 op 13-02-2020 15:42)


  • Klaasvaak
  • Registratie: Maart 2010
  • Laatst online: 13:10
Wanneer een functie data van een server vraagt loopt de rest van het script door.

code:
1
2
3
var data = getDataFromServer();
log(data); // undefined
return data; // return undefined

daarom wordt er gebruikt gemaakt van callback functies die uitgevoerd worden zodra de data binnen is, de functie die als "next" wordt meegegeven.

code:
1
2
3
4
var data = getDataFromServer(callback);
function callback(error, data) {
 if(error) log(error);
 else log(data);


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
const Binance = require('node-binance-api');
const binance = new Binance().options({
   ...
});

Voor meer informatie kan je naar asynchroon javascript googlen.

// var pairsinfo = [];                              /* dit hoeft niet globaal */

module.exports = {
    initExchangeInfo: function (callback) {
        binance.exchangeInfo(function (error, data) {
            if (data.symbols) {
                var pairsinfo = [];                     /* pairsinfo hier als locale aanmaken */
                for (var obj of data.symbols) {
                    ...
                    var object = new Object();                  /* dit kan ook als locale */
                    ...
                    pairsinfo.push(object);
                }
                pairsinfo = pairsinfo.reduce((p, c) => (c.status !== "BREAK" && p.push(c), p), []);
                //console.table(pairsinfo);
            }
            callback(error, pairsinfo);                     /* error en data naar je callback functie */
        })
    };

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

var allpairs = require("./pairs.js")

allpairs.initExchangeInfo(function processData(error, pairsinfo) {
 if(error) {
  console.log(error);
 }
 else {
  console.table(pairsinfo);
 }
};

[ Voor 5% gewijzigd door Klaasvaak op 12-02-2020 14:30 ]

Alle reacties


Acties:
  • 0 Henk 'm!

  • argon007
  • Registratie: April 2011
  • Laatst online: 12:26
Kleine update:

Als ik in mijn hoofdscript (pairs.js) de console.log(pairsinfo) uncomment:
code:
1
2
3
4
5
6
7
8
                }
                pairsinfo = pairsinfo.reduce((p, c) => (c.status !== "BREAK" && p.push(c), p), []);
                console.table(pairsinfo);
            }
            next(error)
        })
    }
}


en in mijn 2de script ik het volgende uitvoer:
code:
1
2
3
4
5
6
7
8
9
var allpairs = require("./pairs.js")

 allpairs.initExchangeInfo(function(error) {
    if(error) {
        console.log("Error initializing exchange info.", error)
        if(next) next("Error initializing exchange info.")
        return
    }
})


Dan krijg ik de console.log van de volledige Array te zien. Dus het aanroepen van de functie lukt op zich wel. Ik slaag er gewoon niet in om die Array in een variabele te krijgen waar ik in het 2de script acties kan op uitvoeren.

Acties:
  • 0 Henk 'm!

  • Tsjilp
  • Registratie: November 2002
  • Niet online

Tsjilp

RS[I]ds

Die next is blijkbaar een callback functie. Dus als je daar de data aan meegeeft krijg je het terug wanneer je
code:
1
allpairs.initExchangeInfo(data => {/*data bevat nu je array*/});
doet

Raar... Is zo gek nog niet


Acties:
  • 0 Henk 'm!

  • Wintervacht
  • Registratie: December 2016
  • Laatst online: 07-08 10:04

Wintervacht

☉ ‿ ⚆

argon007 schreef op woensdag 12 februari 2020 @ 11:15:
Kleine update:

Als ik in mijn hoofdscript (pairs.js) de console.log(pairsinfo) uncomment:
code:
1
2
3
4
5
6
7
8
                }
                pairsinfo = pairsinfo.reduce((p, c) => (c.status !== "BREAK" && p.push(c), p), []);
                console.table(pairsinfo);
            }
            next(error)
        })
    }
}


en in mijn 2de script ik het volgende uitvoer:
code:
1
2
3
4
5
6
7
8
9
var allpairs = require("./pairs.js")

 allpairs.initExchangeInfo(function(error) {
    if(error) {
        console.log("Error initializing exchange info.", error)
        if(next) next("Error initializing exchange info.")
        return
    }
})


Dan krijg ik de console.log van de volledige Array te zien. Dus het aanroepen van de functie lukt op zich wel. Ik slaag er gewoon niet in om die Array in een variabele te krijgen waar ik in het 2de script acties kan op uitvoeren.
Volgens mij ben je een beetje in de war hiermee...
De 2e functie doet niets in dit geval, tenzij er een error optreedt.

Je krijgt allicht de tabel te zien omdat je in je beginfunctie
code:
1
console.table(pairsinfo)

aanroept.

Om de array te kunnen gebruiken moet je zorgen dat de eerste functie een return statement heeft, dus een
code:
1
return pairsinfo;
ergens onderaan, om dat te benutten moet je vanuit de functie die je gemaakt hebt om het te verwerken de eerste functie aanroepen.

In het kort:
code:
1
2
3
4
5
6
7
8
9
10
11
function getData() {
  ...hele lap code...

   return pairsinfo;
}


fcuntion processData() {
    data = getData();
    ...whatever je met je array wil doen...
}

Weet een beetje van veel dingen en veel van een paar dingen.


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Klaasvaak
  • Registratie: Maart 2010
  • Laatst online: 13:10
Wanneer een functie data van een server vraagt loopt de rest van het script door.

code:
1
2
3
var data = getDataFromServer();
log(data); // undefined
return data; // return undefined

daarom wordt er gebruikt gemaakt van callback functies die uitgevoerd worden zodra de data binnen is, de functie die als "next" wordt meegegeven.

code:
1
2
3
4
var data = getDataFromServer(callback);
function callback(error, data) {
 if(error) log(error);
 else log(data);


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
const Binance = require('node-binance-api');
const binance = new Binance().options({
   ...
});

Voor meer informatie kan je naar asynchroon javascript googlen.

// var pairsinfo = [];                              /* dit hoeft niet globaal */

module.exports = {
    initExchangeInfo: function (callback) {
        binance.exchangeInfo(function (error, data) {
            if (data.symbols) {
                var pairsinfo = [];                     /* pairsinfo hier als locale aanmaken */
                for (var obj of data.symbols) {
                    ...
                    var object = new Object();                  /* dit kan ook als locale */
                    ...
                    pairsinfo.push(object);
                }
                pairsinfo = pairsinfo.reduce((p, c) => (c.status !== "BREAK" && p.push(c), p), []);
                //console.table(pairsinfo);
            }
            callback(error, pairsinfo);                     /* error en data naar je callback functie */
        })
    };

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

var allpairs = require("./pairs.js")

allpairs.initExchangeInfo(function processData(error, pairsinfo) {
 if(error) {
  console.log(error);
 }
 else {
  console.table(pairsinfo);
 }
};

[ Voor 5% gewijzigd door Klaasvaak op 12-02-2020 14:30 ]


  • argon007
  • Registratie: April 2011
  • Laatst online: 12:26
Ik zat dus op het correcte spoor, maar ging er zelf niet geraakt zijn. Dus bedankt hiervoor !

Ik heb de zaken aangepast en het de console.table in het 2de script geef mij inderdaad de volledige array terug.

Echter nog 1 bijkomend vraagje. Hoe kan ik de output van de function allpairs.initExchangeInfo in een variable krijgen?

Ik probeer het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
var allpairs = require("./pairs.js")

allpairs.initExchangeInfo(function processData(error, pairsinfo) {
    if (error) {
        console.log("Error initializing exchange info.", error)
    }
        //console.table(pairsinfo);
})

var b = allpairs.initExchangeInfo
console.log(b)


Maar dan verkrijg ik:
code:
1
[Function: initExchangeInfo]


Ik had in mijn 2de script dus graag de volledige array onder var = b gehad om hiermee verder te doen.
Of zijn er andere mogelijkheden om bvb volledig rij 1 van die array op te roepen?

Nogmaals bedankt voor de hulp!

  • Klaasvaak
  • Registratie: Maart 2010
  • Laatst online: 13:10
Alle afhandeling zal binnen de functie processData() of functies die door processData() worden aangeroepen moeten gebeuren. De functie processData() wordt pas (asynchroom) aangeroepen via nadat de data van de server geladen is. De rest van het script loopt intussen verder.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
allpairs.initExchangeInfo(processData);

console.log('Dit wordt al gelogt voordat de data van de server binnen is.');


function processData(error, pairsinfo) {
    if (error) {
        console.log("Error initializing exchange info.", error);
    }
    else {
        console.log('data correct ontvangen');
        // doe iets met de data
        // of roep een een andere  functie aan: createTable(pairsinfo);
    }
});


Voor meer informatie kan je googlen naar asynchroom javascript en callbacks.

Acties:
  • 0 Henk 'm!

  • argon007
  • Registratie: April 2011
  • Laatst online: 12:26
Nogmaals bedankt voor de nuttig info!

Ik dacht echter dat dit wel mogelijk was. Want volgend voorbeeld werkt wel zo:
code:
1
2
3
4
5
6
7
var x = myFunction(4, 3);
console.log(x);


function myFunction(a, b) {
  return a * b;
}


Het verschil in bovenstaand voorbeeld en in mijn situatie is dat er hierboven met parameters gewerkt werd (a en b) terwijl mijn voorbeeld niets van parameters heeft. En in mijn geval zitten we met een Callback terwijl het andere voorbeeld met een return werkt.

Nogmaals, ik ben een complete leek op gebied van programmeren. Ik leer telkens bij, maar het Javascript wereldje is nogal overdonderend op dit moment voor mij :-)

Acties:
  • 0 Henk 'm!

  • Semyon
  • Registratie: April 2001
  • Laatst online: 04-10 22:12
Klaasvaak schreef op woensdag 12 februari 2020 @ 13:55:
Wanneer een functie data van een server vraagt loopt de rest van het script door.

daarom wordt er gebruikt gemaakt van callback functies die uitgevoerd worden zodra de data binnen is, de functie die als "next" wordt meegegeven.
Beetje ouderwets hoor. Gebruik de Fetch api en een await.

Geen callbacks. Niks dat door loopt. Het leest makkelijken tests zijn helemaal makkelijk te schrijven.

Only when it is dark enough, can you see the stars


Acties:
  • 0 Henk 'm!

  • Klaasvaak
  • Registratie: Maart 2010
  • Laatst online: 13:10
Ik heb geen ervaring met de de fetch-api. Maar als je de fetch-api / await gebruikt zal je toch een callback aan je Promise moeten geven? Verder is de code voor de server-request onderdeel van de node-binance-api.

Acties:
  • 0 Henk 'm!

  • psychodude
  • Registratie: Maart 2008
  • Laatst online: 12:41
Klaasvaak schreef op vrijdag 14 februari 2020 @ 17:23:
Ik heb geen ervaring met de de fetch-api. Maar als je de fetch-api / await gebruikt zal je toch een callback aan je Promise moeten geven? Verder is de code voor de server-request onderdeel van de node-binance-api.
Fetch en await staan los van elkaar. Fetch is gewoon een manier om o.a. data te verkrijgen.

Voor het overig is het een kwestie van async/await versus promises. Waarbij promises met de callbacks ik vanuit ga dat je er bekend mee bent, simplistisch onderstaand.

JavaScript:
1
2
3
4
5
fetch("uri")
  .then(response => ...
  .then(foo => ...
  .then(bar => ...
  .catch(err => ...


Met async/await is de callback niet nodig. De volgende stap in de evolutie van javascript na aanvankelijk callback hell naar promises, tot nu async/await.

Bovenstaande code is dan nu te herschrijven tot als volgt binnen een async function.

JavaScript:
1
2
3
4
5
try {
  const response = await fetch("uri")
  const foo = await ...
  const bar = await ...
} catch (err) { ... }


En een belangrijk verschil tegenover de promise-based approach met callbacks, is dat bij een async function de gehele functie asynchroon verloopt, m.a.w. const foo = await ... wacht netjes tot de fetch("uri") regel voltooid is.

Doordat je weet dat de gehele functie asynchroon verloopt, leest en schrijft het als synchronous code en dat is prettig. Bovendien is het voordelig dat je async/await toe kunt passen op iedere functie die een Promise teruggeeft. Ik ken de node-binance-api verder niet, maar een npm search leert in ieder geval dat er Promise ondersteuning is en derhalve async/await dan ook mogelijk is.
Pagina: 1