Lo he probado todo. Quiero obtener de mi servidor algunos datos en un bucle y agregar las respuestas en una matriz en el orden en que ejecuto el bucle for.
Estoy pensando que la respuesta es recursiva, pero lo intenté varias veces y fallé.
Estoy usando AXIOS:
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); }); }
Tal vez ese código esté completamente equivocado, de todos modos es como la séptima vez que lo escribo... Probé con promesas, async/await, sync y ahora recursividad...
Puede ejecutar las llamadas axios en secuencia (una tras otra) de esta manera:
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; }
O bien, puede ejecutarlos en paralelo y recopilar los resultados en orden:
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}; }); })); }
Si los ejecuta en paralelo (lo que puede terminar antes), debe asegurarse de que el servidor de destino aceptará tantas solicitudes simultáneas como su matriz sea larga. Algunos servidores limitarán o rechazarán demasiadas solicitudes simultáneas. Para ejecutar semi-en-paralelo donde tiene N solicitudes en curso al mismo tiempo (cómo procesaría una gran matriz en paralelo sin demasiadas solicitudes en curso a la vez), usaría algo como mapConcurrent() para controlar la ejecución .