javascript - ¿Es factible hacer una solicitud AJAX de un Trabajador Web?
jquery web-worker (3)
Parece que no puedo usar jQuery en mi trabajador web, sé que debe haber una manera de hacerlo con XMLHttpRequest
, pero parece que esa podría no ser una buena opción cuando leo esta respuesta .
Si intenta llamar a un servicio en otro dominio que usa JSONP, puede usar la función importScripts. Por ejemplo:
// Helper function to make the server requests
function MakeServerRequest()
{
importScripts("http://SomeServer.com?jsonp=HandleRequest");
}
// Callback function for the JSONP result
function HandleRequest(objJSON)
{
// Up to you what you do with the data received. In this case I pass
// it back to the UI layer so that an alert can be displayed to prove
// to me that the JSONP request worked.
postMessage("Data returned from the server...FirstName: " + objJSON.FirstName + " LastName: " + objJSON.LastName);
}
// Trigger the server request for the JSONP data
MakeServerRequest();
Encontré este gran consejo aquí: http://cggallant.blogspot.com/2010/10/jsonp-overview-and-jsonp-in-html-5-web.html
Solo usa la función JS fetch () de Fetch API . También puede configurar muchas opciones como desvío de CORS y así sucesivamente (para que pueda lograr el mismo comportamiento como con importScripts pero de una manera mucho más limpia utilizando Promesas ).
Por supuesto , puede usar AJAX dentro de su trabajador web, solo debe recordar que una llamada AJAX es asíncrona y tendrá que usar devoluciones de llamada.
Esta es la función ajax
que uso dentro de mi trabajador web para golpear el servidor y hacer solicitudes AJAX:
var ajax = function(url, data, callback, type) {
var data_array, data_string, idx, req, value;
if (data == null) {
data = {};
}
if (callback == null) {
callback = function() {};
}
if (type == null) {
//default to a GET request
type = ''GET'';
}
data_array = [];
for (idx in data) {
value = data[idx];
data_array.push("" + idx + "=" + value);
}
data_string = data_array.join("&");
req = new XMLHttpRequest();
req.open(type, url, false);
req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
req.onreadystatechange = function() {
if (req.readyState === 4 && req.status === 200) {
return callback(req.responseText);
}
};
req.send(data_string);
return req;
};
Entonces dentro de tu trabajador puedes hacer:
ajax(url, {''send'': true, ''lemons'': ''sour''}, function(data) {
//do something with the data like:
self.postMessage(data);
}, ''POST'');
Es posible que desee leer esta respuesta acerca de algunos de los escollos que pueden suceder si tiene demasiadas solicitudes de AJAX en los trabajadores web.