atrasar foreach até que xmlhttprequest termine o trabalho

Kai

Tentei encontrar uma resposta no StackOverflow e até procurei em outro lugar na Internet, mas não tive sorte. Estou tentando há alguns dias, sem sucesso.

Eu só preciso atrasar meu forEachaté que XMLHttpRequestseja concluído para cada arquivo, com base no meu código abaixo. Desde já, obrigado..

function handleFiles(files,i) {
   files = [...files]
   files.forEach(uploadFile)
}

function uploadFile(file, i) { 
  var Url_imageAdd = "mytargetUrl...."
  var xhr = new XMLHttpRequest()
  var formData = new FormData()
  xhr.open('POST', Url_imageAdd, true)
  xhr.upload.addEventListener("progress", function(e) {
    updateProgress(i, (e.loaded * 100.0 / e.total) || 100)
  })

  xhr.addEventListener('readystatechange', function(e) {
    if (xhr.readyState == 4 && xhr.status == 200) {
      document.getElementById('lConfirm').innerHTML="Files uploaded...."

      urlCount = parseInt($('#urlCount').val())
      $('#urlCount').val(urlCount+filescount)
      var imageSet = JSON.parse(xhr.responseText)
    } else if (xhr.readyState == 4 && xhr.status != 200) {
      alert("Upload Error....")
      window.location.reload();
    }
  })

  formData.append('img_file', file)
  formData.append('title',"mytitle")
  xhr.send(formData)
}
Jacob

Se sua uploadFilefunção retornar uma promessa, você poderá usar awaitou um .then(...)retorno de chamada com Promise.all:

function uploadFile(file, i) { 
  return new Promise((resolve, reject) => {
    var Url_imageAdd = "mytargetUrl...."
    var xhr = new XMLHttpRequest()
    var formData = new FormData()
    xhr.open('POST', Url_imageAdd, true)
    xhr.upload.addEventListener("progress", function(e) {
      updateProgress(i, (e.loaded * 100.0 / e.total) || 100)
    })

    xhr.addEventListener('readystatechange', function(e) {
      if (xhr.readyState == 4 && xhr.status == 200) {
        document.getElementById('lConfirm').innerHTML="Files uploaded...."

        urlCount = parseInt($('#urlCount').val())
        $('#urlCount').val(urlCount+filescount)
        var imageSet = JSON.parse(xhr.responseText)
        resolve(imageSet)
      } else if (xhr.readyState == 4 && xhr.status != 200) {
        reject(new Error("Upload Error...."))
      }
    })

    formData.append('img_file', file)
    formData.append('title',"mytitle")
    xhr.send(formData)
  });
}

Agora você pode fazer isso:

async function handleFiles(files,i) {
   files = [...files]

   try {
     await Promise.all(files.map(uploadFile));
     // We've finished
   } catch (err) {
     alert('Upload failed!');
     window.location.reload();
   }
}

Ou se você quiser executá-los em série em vez de em paralelo, com um atraso de 2 segundos entre:

function delay(milliseconds) {
  return new Promise(resolve => {
    setTimeout(resolve, milliseconds);
  });
}

async function handleFiles(files,i) {
  files = [...files]

    for (let i = 0; i < files.length; i++) { 
        try {
          await delay(2000);
          await uploadFile(files[i], i);
        } catch (err) {
          alert('Upload failed!');
          window.location.reload();
        }
      }

  // We've finished
}

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Como atrasar a ação do botão até que a transição termine em JS

Atrasar a renderização da visualização SwiftUI até que o objeto Publicado termine de carregar

Como atrasar o fechamento de um aplicativo até que todo o código termine de ser executado?

Existe uma maneira de esperar / atrasar a renderização até que # Each-Helper termine com o modelo fornecido?

Como posso atrasar o método ng-init até que minha Variável de escopo termine de carregar?

Como atrasar uma função até que uma instrução forEach seja concluída?

Como fazer o forEach esperar até que a assinatura termine?

SSM enviar comando com Powershell não é concluído até que o trabalho em segundo plano termine

Como o thread do chamador espera até que a tarefa em ScheduledExecutorService termine o trabalho periodicamente

Força todos os outros códigos a não serem executados até que o UserForm termine seu trabalho

Como esperar até que CLGeocoder termine seu trabalho

Retorne um valor de variável para a área de trabalho antes que a função termine

Atrasar trabalho com lambda

Por que o código está sendo executado antes que o loop forEach termine?

A pasta de trabalho do Excel não abre até que o código VBA termine de ser executado

Spring batch jsr 352 como evitar que o trabalho particionado deixe o thread ativo, o que evita que o processo termine

Como fazer com que a instância EC2 EMR termine após a conclusão do trabalho

Como posso forçar a função de esperar até que o código foreach termine em nodejs?

Bloqueie o código até que o primeiro loop forEach termine para usar o resultado em outro loop forEach no Node

Esperando até que a tarefa assíncrona termine seu trabalho

maneira adequada de esperar que uma rotina de trabalho termine

como atrasar uma função que é chamada em um loop while sem atrasar o loop

Espere que o futuro termine

Espere até que o processo termine

Atrasar a ação, a menos que o usuário role

Quando os cronjobs estão configurados para substituir, o Kubernetes espera que o trabalho anterior termine de encerrar antes de iniciar o novo?

Quando os cronjobs estão configurados para substituir, o Kubernetes espera que o trabalho anterior termine de encerrar antes de iniciar o novo?

A execução do trabalho Powershell lida com o processamento em lote de maneira adequada, sem esperar que o lote inteiro termine

Como atrasar a função assíncrona que retorna Deferred <T>

TOP lista

quentelabel

Arquivo