Estoy tratando de publicar algunos datos en una página dentro de un trabajador web y luego publicar el resultado del trabajador en el método de llamada, pero no puedo hacer que funcione. Al usar self.postMessage(obj), publica el resultado correctamente en el script de origen, pero parece que no puedo enviar un mensaje de publicación a un tercero antes de eso.
Intenté usar ajax dentro del método self.onMessage, pero parece que no puedo usar jquery dentro. Y también he intentado solucionar problemas si puedo usar la función postMessage() para enviar con una URL proporcionada, pero parece que no está preintegrada. ¿Hay otra función que pueda usar?
Este es mi script (este es el código de trabajador real):
self.onmessage = function(event) { id = event.data.id; var url = "/lib/fetchData.php"; var data = {}; data.id = id; var json = JSON.stringify(data); var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8'); xhr.onload = function() { if (this.status == 200) { /* Here I want to send a post to a provided url. Like: var url2 = ""; var data = { "uid" : 3, "utype" : 1, }; postMessage(url2, data); // Is there more valid function for this? */ var test = JSON.parse(xhr.responseText); self.postMessage(test); // This post is posting result from fetchData.php back to the originscript as expected } } xhr.onerror = function() { }; xhr.send(json); };¿Existe una función preconstruida para realizar este tipo de operación o algún otro método de mejores prácticas para lograr lo mismo?
Actualización: la razón por la que quiero ejecutar la publicación en segundo plano es porque anteriormente tenía la solicitud posterior en el hilo principal, pero estaba provocando que la interfaz de usuario se congelara mientras se realizaba la publicación (los datos que se publicarán a veces pueden ser bastante grandes).
Actualización 2:
Creo que he encontrado una manera de publicar datos dentro del trabajador. Traté de crear un nuevo xmlhttprequest dentro del actual. No puedo verificar que funcione porque la URL es de un tercero, pero parece que funciona. Aunque no estoy seguro de que sea una buena práctica;)
var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8'); xhr.onload = function() { if (this.status == 200) { var data = { "uid" : 3, "utype" : 1, }; var xhr2 = new XMLHttpRequest(); xhr2.open("POST", "url", true); xhr2.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr2.send(data); var test = JSON.parse(xhr.responseText); self.postMessage(test); } }