Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

190
Visualizações
Necesito ayuda para hacer que el bucle de eventos JS espere la ejecución de una función

Estoy trabajando en un proyecto en el que uso fabric.js

  • Tomo la dirección de la imagen de la base de datos.
  • Reemplace una imagen de marcador de posición en el lienzo.
  • Y luego guarde el lienzo como PNG con ajax.

Cuando ejecuto este código y el índice de registro de la consola en diferentes puntos, vi que el ciclo principal se ejecuta y luego el índice de registros de la pieza de reemplazo de la imagen e incluso más tarde se realiza ajax.

pseudocódigo

 for loop { console.log("start"); // To go through the image addresses array retrieved from database for loop { console.log("Inside Second loop"); // To Go through placeholder images or layer of images // There can be multiple images on canvas to replace // replace Image happens here console.log("BeforeImageChange"); imgToChange.setSrc(imgAddressFromDB){ console.log("AfterImageChange"); } } function saveCanvas(){ //function to save canvas as a Image done through ajax to php console.log("AfterSaving"); } saveCanvas(); console.log("End"); }

La salida de console.log es como

 "start" "Inside Second loop" "BeforeImageChange" "End" "AfterImageChange" "AfterSaving"

¿Cómo puedo hacer que AfterImageChange ocurra justo después de BeforeImageChange y Saving ocurra antes de que finalice el ciclo?

Soy nuevo en javascript, intenté aprender sobre métodos asincrónicos, pero no tienen sentido para mí si son útiles en mi caso. Si necesitas más información comenta abajo. Gracias

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Intente llamar a saveCanvas() dentro del método setSrc , de esta manera se llamará a saveCanvas después de llamar a la consola AfterSaving.

about 4 years ago · Juan Pablo Isaza Relatório

0

Necesitas reorganizar tu código. Ya sabe la respuesta porque sabe cómo se comporta el código, pero quizás no esté familiarizado con las técnicas. Primero necesitas hacer esto:

 for loop { console.log("start"); // To go through the image address retrieved from database for loop { console.log("Inside Second loop"); // To Go through placeholder images or layer of images // replace Image happens here console.log("BeforeImageChange"); imgToChange.setSrc(imgAddressFromDB){ console.log("AfterImageChange"); // You already know that code inside here // gets executed last function saveCanvas(){ //function to save canvas as a Image done through ajax to php console.log("AfterSaving"); } saveCanvas(); console.log("End"); } } }

Pero supongo que no desea saveCanvas() en cada iteración del bucle. Por lo tanto, debe ejecutarlo solo al completar el último setSrc() :

 for loop { console.log("start"); // To go through the image address retrieved from database let setSrcCount = figureOutHowManyTimesTheForLoopBelowLoops(); for loop { console.log("Inside Second loop"); console.log("BeforeImageChange"); imgToChange.setSrc(imgAddressFromDB){ console.log("AfterImageChange"); setSrcCount --; if (setSrcCount === 0) { function saveCanvas(){ //function to save canvas as a Image done through ajax to php console.log("AfterSaving"); } saveCanvas(); console.log("End"); } } } }

El código se puede hacer más legible si usa Promesas :

 function setSrc(imgAddress) { return new Promise((ok,err) => { imgToChange.setSrc(imgAddress,function () { ok(); }); }); } async function functionContainingLoops() { for loop { console.log("start"); // To go through the image address retrieved from database for loop { console.log("Inside Second loop"); // To Go through placeholder images or layer of images // replace Image happens here console.log("BeforeImageChange"); await setSrc(imgAddressFromDB); console.log("AfterImageChange"); } function saveCanvas(){ //function to save canvas as a Image done through ajax to php console.log("AfterSaving"); } saveCanvas(); console.log("End"); } } ContainingLoops()
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda