Search code examples
javascriptajaxmultithreadingasynchronousweb-worker

Why WebWorker is firing several times on message event?


Trying to get image in base64 from web-worker. All is fine, except worker is replying several times to .onmessage event:

enter image description here

main.js part:

var worker = new Worker( 'js/ww.js' );
worker.onmessage = function(e) {
    console.log( e );
};
worker.postMessage( { url: '/api/aerial?x=159&y=94&zoom=8&base64=true' } );

ww.js, WebWorker part:

var self = this;

function makeRequest( url ) {
    var httpRequest = new XMLHttpRequest();

    if ( !httpRequest ) {
        console.error( 'Giving up. Cannot create an XMLHTTP instance.' );
        return false;
    }

    httpRequest.onreadystatechange = function() {
        var response = httpRequest.responseText;
        self.onMessage = postMessage( response );
    };

    httpRequest.open( 'GET', url, true );
    httpRequest.send();
}

self.addEventListener( 'message', function( event ) {
    makeRequest( event.data.url );
});

Why is it firing several times?

May it happened because of such native AJAX use?


Solution

  • Check for the correct state and status of the request.
    In your onreadystatechange-handler you should do the following:

    httpRequest.onreadystatechange = function() {
        if (httpRequest.readyState == 4 && httpRequest.status == 200) {
            var response = httpRequest.responseText;
            self.onMessage = postMessage( response );
        }
    }