2016-10-12 2 views
1

J'essaie de communiquer avec un employé de Dart, mais je n'ai pas eu de succès et j'ai essayé tout ce que je pouvais penser. En tant que test, j'essaie juste d'obtenir un travailleur de base qui répond simplement avec tout ce qui est envoyé au travail.Communiquer avec un travailleur partagé dans Dart

A partir du HTML:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta name="scaffolded-by" content="https://github.com/google/stagehand"> 
    <title>wtf</title> 
    <link rel="stylesheet" href="styles.css"> 
    <script defer src="main.dart" type="application/dart"></script> 
    <script defer src="packages/browser/dart.js"></script> 

    <!-- <script defer src="test.js"></script> --> 
</head> 

<body> 

    <div id="output"></div> 

</body> 
</html> 

travailleur JavaScript (worker.js):

onconnect = function(e) { 
    var port = e.ports[0]; 

    port.onmessage = function(e) { 
     port.postMessage("Worker received message: " + e.data); 
    } 
} 

Le code Dart (de main.dart):

import 'dart:html'; 
import 'dart:async'; 

void main() async { 
    var myWorker = new SharedWorker("worker.js"); 

    myWorker.port.onMessage.listen((msg) { 
     print("Worker says: " + msg); 
     }); 

    new Timer.periodic(const Duration(seconds: 1), (timer) { 
     myWorker.port.postMessage("Hello, world"); 
     }); 
} 

L'écrivain ne est invoqué toutes les secondes et j'ai vérifié que le worker partagé fonctionne (avec chrome: // inspect).

Pour réduire le problème, j'ai jeté une version JavaScript du code Dart (dans test.js) qui fonctionne comme prévu. Si vous commentez le contenu de main() et décommentez la référence dans le HTML à test.js cela fonctionne. Contenu de test.js:

var myWorker = new SharedWorker("worker.js"); 

myWorker.port.onmessage = function(e) { 
    console.log("Worker says: " + e.data); 
} 

setInterval(function() { 
    myWorker.port.postMessage("Hello, world"); 
}, 1000); 

Cependant, lorsque vous utilisez la version Dart, rien n'est écrit sur la console. Il n'y a pas d'erreurs au moment de la compilation ou de l'exécution. Il échoue simplement silencieusement.

Toute aide serait grandement appréciée. Je manque probablement quelque chose de stupide, mais je suis coincé là-dessus depuis plus longtemps que je l'avouer ...

Répondre

2

Depuis le travailleur est un SharedWorker, vous devez appeler la méthode:

myWorker.port.start(); 

juste après l'auditeur onMessage attacher, (documentation at MDN):

Si l'événement est fixé à l'aide onmessage addEventListener, le port est démarré manuellement en utilisant sa méthode start()


En outre, à l'auditeur, le paramètre msg est un MessageEvent et le texte peut être récupéré en accédant data propriété (comme votre code JS):

print("Worker says: " + msg.data); 

Suivez le code entier avec les changements:

import 'dart:html'; 
import 'dart:async'; 

void main() async { 
    var myWorker = new SharedWorker("worker.js"); 

    myWorker.port.onMessage.listen((msg) { 
     print("Worker says: " + msg.data); 
    }); 
    myWorker.port.start(); 

    new Timer.periodic(const Duration(seconds: 1), (timer) { 
     myWorker.port.postMessage("Hello, world"); 
    }); 
} 

testé avec Dart 1.19.1

+0

Merci! Je n'utilise pas addEventListener (d'où le code équivalent fonctionnant en JavaScript), donc je pensais que c'était inutile. Je suppose que les liaisons Dart utilisent en interne addEventListener; Je vais déposer un bug pour améliorer la documentation de Dart pour le mentionner. – nemequ

+0

Ce n'était rien! Oui tu as raison. J'ai trouvé [ici] (https://webdev.dartlang.org/articles/low-level-html/improving-the-dom#events) que Dart utilise probablement 'addEventListener' lors de l'appel' listen'. Mais la documentation de Dart doit vraiment s'améliorer. :) – Gomiero