Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

HTTP fetch info IN ORDER and add to array in the order specified

I have tried it all. I want to fetch from my server some data in a loop, and add the ressponses in an array in the order I run the for loop.

I am thinking the answer is in recursion, but tried it several times and failed.

I am using AXIOS:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

let currentPhraseWordAssign = [];

function addPartOfSpeechAndWordPhrasesToFullScript () {
    assignPartOfSpeechAndAddToPhraseArray(["phrase", "run"]).then(() => {console.log(currentPhraseWordAssign)});
}


async function assignPartOfSpeechAndAddToPhraseArray (phrase) {
    if(currentPhraseWordAssign.length >= phrase.length) {
        console.log(currentPhraseWordAssign);
        currentPhraseWordAssign = [];
        return;
    }
    let word = phrase[currentPhraseWordAssign.length];
    axios({
        method: 'get',
        url: `http://localhost:9200/english_minus_verbs/_search`,
        headers: {
            'Content-Type': 'application/json'
        },
        data: {
            _source: ["part_of_speech"],
            query: {
                term: {
                    word: word,
                }
            }
        }
    }).then((r) => {
        try {
            currentPhraseWordAssign.push({word: word, partOfSpeech: r.data.hits.hits[0]._source.part_of_speech});
        }catch (e) {
            currentPhraseWordAssign.push({word: word, partOfSpeech: 'verb'});
        }
    }).then(()=>{
        assignPartOfSpeechAndAddToPhraseArray(phrase);
    });
}

Maybe that code is completely wrong, it is anyway like the 7th time I write it… I tried with promises, async/await, sync, and now recursion…

>Solution :

You can run the axios calls in sequence (one after the other) like this:

async function lookupWords(arrayOfWords) {
    let currentPhraseWordAssign = [];
    for (let word of arrayOfWords) {
        const data = await axios({
            method: 'get',
            url: `http://localhost:9200/english_minus_verbs/_search`,
            headers: {
                'Content-Type': 'application/json'
            },
            data: {
                _source: ["part_of_speech"],
                query: {
                    term: {
                        word: word,
                    }
                }
            }
        });
        currentPhraseWordAssign.push({word: word, partOfSpeech: r.data.hits.hits[0]._source.part_of_speech});        
    }
    return currentPhraseWordAssign;
}

Or, you can run them in parallel and collect the results in order:

function lookupWords(arrayOfWords) {
    return Promise.all(arrayOfWords.map(word => {
        return axios({
            method: 'get',
            url: `http://localhost:9200/english_minus_verbs/_search`,
            headers: {
                'Content-Type': 'application/json'
            },
            data: {
                _source: ["part_of_speech"],
                query: {
                    term: {
                        word: word,
                    }
                }
            }
        }).then(r => {
            return {word: word, partOfSpeech: r.data.hits.hits[0]._source.part_of_speech};
        });
    }));
}

If you run them in parallel (which may finish sooner), you have to make sure that the target server will accept however many simultaneous requests as your array is long. Some servers will limit or reject too many simultaneous requests. To run semi-in-parallel where you have N requests in flight at the same time (how you would process a large array in parallel without too many requests in flight at once), you would use something like mapConcurrent() to control the execution.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading