Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal eu tenho uma seguinte requisição $http no angular
//send data
$scope.send = function(){
var manual = $("#origin_1").prop("checked");
var agenda = $("#origin_2").prop("checked");
var grupo = $("#origin_3").prop("checked");
var expressa = $("#origin_4").prop("checked");
var flash = $("#flash").prop("checked");
var modelo = $("#salvar_modelo").prop("checked");
var twoways = $("#2ways").prop("checked");
var rota = $("#rota").prop("checked");
var twoways_email = $("#2ways_email").val();
var twoways_url = $("#2ways_url").val();
var destinatario = $('#destManual').tagsinput('items');
var etiqueta = $("#etiquetas").tagsinput('items');
var campanha = $('#campaingName').val();
var remetente = $('#remetente_text').val();
var ddi = $("#pais").val();
var pais = $("#pais option:selected").text();
var texto = $("#smsText").val();
var programaData = $("#schedule_date").val();
var programaHora = $("#schedule_time").val();
var programaZone = $("#schedule_timezone option:selected").text();
swal({
title: 'Iniciar envio da campanha?',
text: "Ao confirmar, o processo não poderá ser pausado e/ou cancelado",
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Sim, iniciar!',
cancelButtonText: 'Não, espere!',
confirmButtonClass: 'btn btn-sweet btn-success',
cancelButtonClass: 'btn btn-sweet btn-danger',
padding: '20',
buttonsStyling: false
}).then(function () {
swal(
{
title: 'Campanha iniciada!',
text: "Sua campanha está sendo disparada. Não saia desta página enquanto processamos todos os dados.",
showCancelButton: false,
showConfirmButton: false,
imageUrl: "https://smsfire.com.br/portal/includes/images/loader.gif",
timer: 5000
}
),
$http({
url: "/portal/includes/modules/sms/send-campaing.php",
method: "POST",
headers: {'Content-Type': 'application/json'},
data: {
origem:[{
manual:manual,
agenda:agenda,
grupo:grupo,
expressa:expressa
}
],
pais:pais,
ddi:ddi,
destinatario:destinatario,
texto:texto,
campanha:campanha,
modelo:modelo,
etiqueta:etiqueta,
programa:[{
data:programaData,
hora:programaHora,
zone:programaZone
}
],
rota:rota,
remetente:remetente,
flash:flash,
modelo:modelo,
twoways:[{
ativa:twoways,
email:twoways_email,
url:twoways_url
}]
} }.then(function (response) {
swal({
title:'Envio finalizado!',
text:'O processamento da campanha foi concluído. Acesse o menu Estatísticas para obter detalhes',
type: 'success'
})
}).then(function (){
$timeout(function () {
location.reload();
}, 3000);
})
}, function (dismiss) {
// dismiss can be 'cancel', 'overlay',
// 'close', and 'timer'
if (dismiss === 'cancel') {
swal(
'Cancelado!',
'O processamento da campanha foi cancelado.',
'error'
)
}
});
});
**O que ela faz?**
Emito um alert perguntando se posso processar a campanha.
Usuario clica SIM e chamo o arquivo PHP para processar a requisição.
Assim que a requisição for completada imprimo outro alert com timeout de 3seg e recarrego a pagina
**Está funcionando?**
Sim perfeitamente!
**Qual o problema?**
O tamanho da requisição!
Essa chamada pode conter uma infinidade de dados que, talvez, demore mais que os 90 segundos de timeout que meu servidor tem no PHP para recuperar o response.
O script, segue fazendo a requisição passados os 90segundos, mas ao tentar imprimir o response, tenho erro 500-timeout.
**O que estou precisando**
Realizar uma chamada assincronica, ou seja, deixar que o meu sistema continue rodando enquanto essa requisição $http fique rodando em background.
**Como tentei:**
No meu php tentei utilizar o session_write_close() porem isso faz com que as SESSIONS sejam deletadas e todo o meu processo de looping é dado como TRUE já que tenho condicionamentos baseado em alguns parametros da session. Desta forma funciona mas não da forma que preciso.
Na propria requisição $http há algum parametro que eu possa indicar para que pelo JS seja compreensivel que a requisição é assincronica?
Eu não consegui encontrar detalhes deste tipo na documentação do angular.
Alguma sugestão?É como o @William Bruno disse, já é assíncrono.
Seu objetivo é alternar de controller e manter a execução em background?
>
1 hora atrás, hargon disse:
É como o @William Bruno disse, já é assíncrono.
Seu objetivo é alternar de controller e manter a execução em background?
Exato.
Minha pagina não sai da requisição atual até ter o response do $http
Eu atualizei o código mas ele segue aguardando o response para poder atualizar a pagina
$scope.sendSMS = function(){
...
swal({
title: 'Iniciar envio da campanha?',
text: "Ao confirmar, o processo não poderá ser pausado e/ou cancelado",
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Sim, iniciar!',
cancelButtonText: 'Não, espere!',
confirmButtonClass: 'btn btn-sweet btn-success',
cancelButtonClass: 'btn btn-sweet btn-danger',
padding: '20',
buttonsStyling: false
}).then(function () {
$http({
url: "/portal/includes/modules/sms/send-campaing.php",
method: "POST",
headers: {'Content-Type': 'application/json'},
data: {
origem:[{
manual:manual,
agenda:agenda,
grupo:grupo,
expressa:expressa
}
],
pais:pais,
ddi:ddi,
destinatario:destinatario,
texto:texto,
campanha:campanha,
modelo:modelo,
etiqueta:etiqueta,
programa:[{
data:programaData,
hora:programaHora,
zone:programaZone
}
],
rota:rota,
remetente:remetente,
flash:flash,
modelo:modelo,
twoways:[{
ativa:twoways,
email:twoways_email,
url:twoways_url
}]
}
}),
swal(
{
title: 'Campanha iniciada!',
text: "Sua campanha está sendo disparada. Não saia desta página enquanto processamos todos os dados.",
showCancelButton: false,
showConfirmButton: false,
imageUrl: "https://smsfire.com.br/portal/includes/images/loader.gif",
timer: 5000
}).catch(function () {
swal({
title:'Envio finalizado!',
text:'O processamento da campanha foi concluído. Acesse o menu Estatísticas para obter detalhes',
type: 'success'
}).then(function (){
location.reload();
/*-----------------------------------------------------------------------------------
ESTE RELOAD SOMENTE ACONTECE APOS A PAGINA REQUISITADA NO $HTTP ENVIAR UM RESPONSE.
-----------------------------------------------------------------------------------*/
});
}), function (dismiss) {
// dismiss can be 'cancel', 'overlay',
// 'close', and 'timer'
if (dismiss === 'cancel') {
swal(
'Cancelado!',
'O processamento da campanha foi cancelado.',
'error'
).catch(swal.noop);
}
}
});
}
});
E como essa requisição pode acontecer 1.000.000.000 de vezes, se em tela o meu script ficar aguardando o response eu terei timeout do servidor.
Preciso que enquanto o servidor processa tudo o que foi enviado no $http, meu usuario fique livre para navegar na plataforma, só que da forma atual a pagina fica aguardando o response do $http.
Se eu fechar o browse e acompanhar via registros no BD, as requisições sao formalizadas corretamente, mas isso nao pode acontecer se nao meu usuario pensará que minha plataforma está travando.Você está utilizando AngularJs 1, correto?
Uma saída seria realizar essa chamada dentro do método ".run()" (uma maneira de torná-la global) ... mas não é recomendável trabalhar assim, se você tiver que fazer isso com todas as chamadas, terá que buscar uma solução melhor.
>
27 minutos atrás, hargon disse:
Você está utilizando AngularJs 1, correto?
Uma saída seria realizar essa chamada dentro do método ".run()" (uma maneira de torná-la global) ... mas não é recomendável trabalhar assim, se você tiver que fazer isso com todas as chamadas, terá que buscar uma solução melhor.
vou testar este metodo.
E não será em todas... é só em algumas especificas que eu preciso disso.
Ainda assim não funciona...
Sempre que faço a requisição do $http o meu browse fica esperando o response para poder realizar qualquer outra ação.
Não consegui de nenhuma forma :(
>
Em 25/09/2017 at 12:40, Guilherme Luiz disse:
Sempre que faço a requisição do $http o meu browse fica esperando o response para poder realizar qualquer outra ação.
Cara não faz sentido...
A própria documentação afirma que é Asyn.
Você faz uso de Interceptors?
Pode ser esse swal() tmb...
Enfim, de qualquer forma não é uma boa ideia 'esperar' o resultado disso.
Já ouviu falar em 'filas'?
A Amazon tem uma opção legal:
https://aws.amazon.com/pt/sqs/
Está como seu Back em php? Laravel? É easy-easy configurar:
https://laravel.com/docs/5.5/queues
Assim basicamente você ia startar o serviço e enquanto roda background você pode ficar perguntando com o Angular se o php já terminou de processar aquela fila.
https://docs.angularjs.org/api/ng/service/$interval
Essa fila é sobre E-mail?
mailgun.com é sucesso, ou até mesmo a Amazon4Win
>
Citar
Está como seu Back em php? Laravel? É easy-easy configurar:
https://laravel.com/docs/5.5/queues
Está em PHP estruturado.
>
17 horas atrás, gabrieldarezzo disse:
Assim basicamente você ia startar o serviço e enquanto roda background você pode ficar perguntando com o Angular se o php já terminou de processar aquela fila.
Vou checar essa função do angular
>
17 horas atrás, gabrieldarezzo disse:
Essa fila é sobre E-mail?
É disparo de SMS em massa. Como cada SMS tem parametros distintos com resultados dinamicos eu não consigo fazer requisições fora de loop continuo.
Nada feito!
Este meu código a requisição fica em async mas ao tentar atualizar a pagina ela não atualiza porque fica esperando um response do $http.
Alguem pode me dar uma luz de como executar o $http do angularjs ignorando o seu response e deixando assim que a minha pagina seja atualizada?!
por padrão a requisição é assíncrona.
da forma que está ela é assíncrona.
https://docs.angularjs.org/api/ng/service/$http