javascript: return een array uit een function

Alles over programmeren en development binnen de IT-wereld
Plaats reactie
Argon
Elite Poster
Elite Poster
Berichten: 1265
Lid geworden op: 21 mei 2007, 22:26
Uitgedeelde bedankjes: 20 keer
Bedankt: 49 keer

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: Selecteer alles

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:
Afbeelding

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!
Argon
Elite Poster
Elite Poster
Berichten: 1265
Lid geworden op: 21 mei 2007, 22:26
Uitgedeelde bedankjes: 20 keer
Bedankt: 49 keer

Kleine update:

Als ik in mijn hoofdscript (pairs.js) de console.log(pairsinfo) uncomment:

Code: Selecteer alles

                }
                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: Selecteer alles

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.
redman
Elite Poster
Elite Poster
Berichten: 1669
Lid geworden op: 26 okt 2005, 23:19
Uitgedeelde bedankjes: 66 keer
Bedankt: 95 keer

Ik heb ook niet zoveel ervaring met dit (blijkbaar oud) systeem van modules te importeren.

In pairs.js wordt er geen return gedaan van pairsinfo.

Ik denk dat het als volgend er moet uitzien in pairs.js.

Code: Selecteer alles

pairsinfo = pairsinfo.reduce((p, c) => (c.status !== "BREAK" && p.push(c), p), []);
return pairsinfo;
esdeka
Starter
Starter
Berichten: 7
Lid geworden op: 16 nov 2009, 22:50
Uitgedeelde bedankjes: 5 keer

Je gebruikt nu asynchrone functies (wat meestal moet met modules die ergens data ophalen zoals HTTP requests). Dan wordt er vaak gebruik gemaakt van een zogenoemde callback functie ("next" in jouw code) om resultaten terug te geven vanuit modules naar het originele script.

Returns geven geen resultaten terug omdat de code niet pauzeert en de taak is nog bezig in de achtergrond wanneer de return wordt gedaan.
In plaats daarvan geef je een callback functie mee wanneer je de asynchrone taak start, die door de module zal opgeroepen worden als het klaar is met de taak en zo via de callback functieparameters resultaten teruggeeft.

Niet echt makkelijk om uit te leggen, dus google best eens op javascript callbacks, er zijn vast betere artikels voor beginners die het verduidelijken.

Voor je code, de next callback functie geeft nu bvb al de `error` variable door, wat jij wilt is dat dan ook de variabele pairsinfo doorgegeven wordt.
Dus om het te laten werken:
In pairs.js vervang

Code: Selecteer alles

            next(error)
Door

Code: Selecteer alles

            next(error, pairsinfo)
In je 2de script kan je dan zo pairsinfo ontvangen:

Code: Selecteer alles

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

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

Terug naar “Development”