2016-10-12 2 views
3

Ich habe es mit einem Web-Mitarbeiter zu tun, der einen Fehler melden muss, wenn ein Fehler aufgetreten ist. Normalerweise kann ich worker.onerror verwenden, um alle Fehler zu hören, die vom Worker ausgelöst wurden. Wenn der Fehler in einem Versprechen im Web Worker auftritt, kann ich jedoch nicht herausfinden, wie der Fehler wieder auf worker.onerror übertragen werden kann.Wie kann man einen Web-Worker-Fehler in einem Versprechen über worker.onerror blasen?

Entschuldigen Sie das ungerade Code-Snippet, da dies der einzige Weg zu sein scheint, das Verhalten der Mitarbeiter zu demonstrieren. (Der Worker ist im HTML-Abschnitt definiert).

function getInlineJS() { 
 
    var js = document.querySelector('[type="javascript/worker"]').textContent; 
 
    var blob = new Blob([js], { 
 
    "type": "text\/plain" 
 
    }); 
 
    return URL.createObjectURL(blob); 
 
} 
 

 
var worker = new Worker(getInlineJS()); 
 

 
worker.onerror = function(err) { 
 
    document.getElementById('errors').innerHTML += 
 
    "error " + err.message + '\n'; 
 
} 
 

 
worker.onmessage = function (msg) { 
 
    console.log("message recieved", msg); 
 
    document.getElementById('messages').innerHTML += 
 
    "message " + msg.data + '\n'; 
 
} 
 

 

 
worker.postMessage("run"); 
 
worker.postMessage("promise");
should write "Normal Error and In Promise Error" below and in console (promise error only occurs in console though): <br> 
 

 
<pre id="errors"> 
 
</pre> 
 

 
messages: 
 
<pre id="messages"> 
 
</pre> 
 

 
<script type="javascript/worker"> 
 
self.addEventListener("message", function(e) { 
 
    /* demonstration of normal error bubbling to onerror */ 
 
    if (e.data == 'run') { 
 
     throw new Error('Normal Error'); 
 
     return; 
 
    } 
 
    new Promise(function(resolve, reject) { 
 
     /* some logic that breaks */ 
 
     throw new Error('In Promise Error'); 
 
    }).then(function(result) { 
 
     
 
    }).catch(function(err) { 
 
     /* QUESTION: HOW TO GET THIS ERROR OUT OF WORKER? */ 
 
     
 
     /* it logs to console just fine */ 
 
     console.log("In Promise Catch Error:", err); 
 
     
 
     /* postMessage doesn't work for some reason */ 
 
     self.postMessage({error: err}); 
 
     
 
     /* and this doesn't bubble it to worker.onerror */ 
 
     throw err; /* doesn't bubble!! */ 
 
    }); 
 
}); 
 
</script>

Wie kann ich Web-Arbeiter Fehler abrufen, die innerhalb Versprechen geschehen?

+0

Anstatt zu versuchen, 'zu verwenden onerror', was ist mit den Arbeitnehmern eine bestimmte Nachricht zu senden, wenn ein bestimmte Fehler auftritt? –

+0

@torazaburo Ich habe das Beispiel Snippet aktualisiert, können Sie noch einmal schauen? Die 'self.postMessage' funktioniert nicht im Abschnitt '.catch' der Versprechungskette. –

Antwort

8

postmessage funktioniert nicht aus irgendeinem Grunde

Das ist, weil Sie ein Objekt anstelle einer Zeichenfolge sind Rückkehr, es

Was Ihr zweites Problem zu self.postMessage({error: err.message}); ändern, können Sie Verwende den setTimeout(function() { throw err; }); Trick. Weitere Informationen über die Situation und Trick finden Sie here.

function getInlineJS() { 
 
    var js = document.querySelector('[type="javascript/worker"]').textContent; 
 
    var blob = new Blob([js], { 
 
    "type": "text\/plain" 
 
    }); 
 
    return URL.createObjectURL(blob); 
 
} 
 

 
var worker = new Worker(getInlineJS()); 
 

 
worker.onerror = function(err) { 
 
    document.getElementById('errors').innerHTML += 
 
    "error " + err.message + '\n'; 
 
} 
 

 
worker.onmessage = function (msg) { 
 
    console.log("message recieved", msg); 
 
    document.getElementById('messages').innerHTML += 
 
    "message " + msg.data + '\n'; 
 
} 
 

 

 
worker.postMessage("run"); 
 
worker.postMessage("promise");
should write "Normal Error and In Promise Error" below and in console (promise error only occurs in console though): <br> 
 

 
<pre id="errors"> 
 
</pre> 
 

 
messages: 
 
<pre id="messages"> 
 
</pre> 
 

 
<script type="javascript/worker"> 
 
self.addEventListener("message", function(e) { 
 
    /* demonstration of normal error bubbling to onerror */ 
 
    if (e.data == 'run') { 
 
     throw new Error('Normal Error'); 
 
     return; 
 
    } 
 
    new Promise(function(resolve, reject) { 
 
     /* some logic that breaks */ 
 
    
 
     throw new Error('In Promise Error'); 
 
    }).then(function(result) { 
 
     
 
    }).catch(function(err) { 
 
     /* it logs to console just fine */ 
 
     console.log("In Promise Catch Error:", err); 
 
     
 
     /* postMessage works when you return a string. */ 
 
     self.postMessage({error: err.message}); 
 

 
     setTimeout(function() { throw err; }); 
 
    }); 
 
}); 
 
</script>

Verwandte Themen