respuestas - jQuery, ejemplo de votación simple
remove attribute jquery (7)
Aquí hay un artículo útil sobre el sondeo largo (solicitud HTTP largamente mantenida) usando jQuery. Un fragmento de código derivado de este artículo:
(function poll() {
setTimeout(function() {
$.ajax({
url: "/server/api/function",
type: "GET",
success: function(data) {
console.log("polling");
},
dataType: "json",
complete: poll,
timeout: 2000
})
}, 5000);
})();
Esto hará que la próxima solicitud solo después de que se haya completado la solicitud de Ajax.
Una variación de lo anterior que se ejecutará inmediatamente la primera vez que se llame antes de respetar el intervalo de espera / tiempo de espera.
(function poll() {
$.ajax({
url: "/server/api/function",
type: "GET",
success: function(data) {
console.log("polling");
},
dataType: "json",
complete: setTimeout(function() {poll()}, 5000),
timeout: 2000
})
})();
Estoy aprendiendo jQuery, y estoy tratando de encontrar un ejemplo de código simple que sondeará una API para una condición. (es decir, solicite una página web cada pocos segundos y procese los resultados)
Estoy familiarizado con la forma de hacer AJAX en jQuery, parece que no puedo encontrar la forma "correcta" de lograr que se ejecute con un "temporizador".
Desde ES6,
var co = require(''co'');
var $ = require(''jQuery'');
// because jquery doesn''t support Promises/A+ spec
function ajax(opts) {
return new Promise(function(resolve, reject) {
$.extend(opts, {
success: resolve,
error: reject
});
$.ajax(opts);
}
}
var poll = function() {
co(function *() {
return yield ajax({
url: ''/my-api'',
type: ''json'',
method: ''post''
});
}).then(function(response) {
console.log(response);
}).catch(function(err) {
console.log(err);
});
};
setInterval(poll, 5000);
- No usa recursión (la pila de funciones no se ve afectada).
- No sufre donde setTimeout-recursión necesita ser optimizado.
jQuery.Deferred() puede simplificar la administración de la secuenciación asíncrona y el manejo de errores.
polling_active = true // set false to interrupt polling
function initiate_polling()
{
$.Deferred().resolve() // optional boilerplate providing the initial ''then()''
.then( () => $.Deferred( d=>setTimeout(()=>d.resolve(),5000) ) ) // sleep
.then( () => $.get(''/my-api'') ) // initiate AJAX
.then( response =>
{
if ( JSON.parse(response).my_result == my_target ) polling_active = false
if ( ...unhappy... ) return $.Deferred().reject("unhappy") // abort
if ( polling_active ) initiate_polling() // iterative recursion
})
.fail( r => { polling_active=false, alert(''failed: ''+r) } ) // report errors
}
Este es un enfoque elegante, pero hay algunos problemas ...
- Si no desea que
then()
desconecte inmediatamente, la devolución de llamada devolverá otro objeto recuperable (probablemente otroDeferred
), que las líneas sleep y ajax hacen. - Los otros son demasiado vergonzosos para admitirlo. :)
(function poll() {
setTimeout(function() {
//
var search = {}
search["ssn"] = "831-33-6049";
search["first"] = "Harve";
search["last"] = "Veum";
search["gender"] = "M";
search["street"] = "5017 Ottis Tunnel Apt. 176";
search["city"] = "Shamrock";
search["state"] = "OK";
search["zip"] = "74068";
search["lat"] = "35.9124";
search["long"] = "-96.578";
search["city_pop"] = "111";
search["job"] = "Higher education careers adviser";
search["dob"] = "1995-08-14";
search["acct_num"] = "11220423";
search["profile"] = "millenials.json";
search["transnum"] = "9999999";
search["transdate"] = $("#datepicker").val();
search["category"] = $("#category").val();
search["amt"] = $("#amt").val();
search["row_key"] = "831-33-6049_9999999";
$.ajax({
type : "POST",
headers : {
contentType : "application/json"
},
contentType : "application/json",
url : "/stream_more",
data : JSON.stringify(search),
dataType : ''json'',
complete : poll,
cache : false,
timeout : 600000,
success : function(data) {
//
//alert(''jax'')
console.log("SUCCESS : ", data);
//$("#btn-search").prop("disabled", false);
// $(''#feedback'').html("");
for (var i = 0; i < data.length; i++) {
//
$(''#feedback'').prepend(
''<tr><td>'' + data[i].ssn + ''</td><td>''
+ data[i].transdate + ''</td><td>''
+ data[i].category + ''</td><td>''
+ data[i].amt + ''</td><td>''
+ data[i].purch_prob + ''</td><td>''
+ data[i].offer + ''</td></tr>'').html();
}
},
error : function(e) {
//alert("error" + e);
var json = "<h4>Ajax Response</h4><pre>" + e.responseText
+ "</pre>";
$(''#feedback'').html(json);
console.log("ERROR : ", e);
$("#btn-search").prop("disabled", false);
}
});
}, 3000);
})();
function doPoll(){
$.post(''ajax/test.html'', function(data) {
alert(data); // process results here
setTimeout(doPoll,5000);
});
}
function make_call()
{
// do the request
setTimeout(function(){
make_call();
}, 5000);
}
$(document).ready(function() {
make_call();
});
function poll(){
$("ajax.php", function(data){
//do stuff
});
}
setInterval(function(){ poll(); }, 5000);