Tengo una pregunta sobre el mejor enfoque para llamar a funciones asíncronas en una matriz de valores, en JavaScript.
Tenga en cuenta que en mi entorno no puedo usar ningún método asíncrono/en espera, ni puedo usar promesas .
Por ejemplo, en mi caso, tengo esta función de encriptación SHA256:
sha256(not_encrypted_string, function(encrypted_string) { // do stuff });Quiero usar esta función para cifrar cada valor en una matriz de longitud desconocida:
const strings_i_want_to_hash = ["string1", "string2", "string3", "string4", "string5", ...];Entonces mi pregunta es, ¿cuál es la mejor manera de abordar el hash de todo esto? No puedo usar algo como
const hashed_strings = strings_i_want_to_hash.map(sha256);... porque es asíncrono. ¿Derecha?
La mejor manera que se me ocurre es crear una matriz vacía para colocar las cadenas codificadas y esperar a que sea tan larga como la matriz de entrada:
const hashed_strings = []; strings_i_want_to_hash.forEach(function(str){ sha256(str, function(hashed_str) { hashed_strings.push(hashed_str); }); }); while (hashed_strings.length < strings_i_want_to_hash.length) { continue; }... pero esto parece un enfoque realmente de mierda.
¿Conocen una mejor manera de manejar esto?
Si bien no he probado su código, sospecho que el ciclo while bloqueará el hilo y es posible que su programa nunca se complete.
Una opción es envolver su función asíncrona en otra que rastree el conteo. Algo como:
function hashString(str, cb){ // Simulate async op setTimeout(() => cb('hashed-'+str), 500); } function hashManyStrings(strings, cb){ const res = []; strings.forEach(function(str){ hashString(str, function(hashed){ res.push(hashed); if(res.length === strings.length){ cb(res); } }) }) } hashManyStrings(['hi', 'hello','much', 'wow'], function(result){ console.log('done', result) })