Как получить простой ответ от изолята? - PullRequest
1 голос
/ 11 июля 2019

Я узнаю о Isolate. Я читаю документы. И хочу написать минимальный рабочий пример. Вот мой код:

main() async
 {

  ReceivePort receivePort = ReceivePort();
  Isolate.spawn(echo, receivePort.sendPort);

  var sendPort = await receivePort.first;

 }


 echo(SendPort sendPort)
 {
   ReceivePort receivePort = ReceivePort();
   sendPort.send(receivePort);
 }

Это почти нормально, но я не могу понять, как я могу отправить простое сообщение "Hello" обратно. Я посмотрел несколько примеров, и было какое-то промежуточное ПО, например sendReceive(). Я правильно понимаю, что после:

var sendPort = await receivePort.first;

sendPort будет хранить имя / адрес порожденной функции, и мне нужно sendPort.send("hello");?

1 Ответ

0 голосов
/ 11 июля 2019

Вы уже указали, как отправлять простые данные, используя SendPort.send. Фактически, вы только способны отправлять примитивные типы данных , т.е. null, num, bool, double, String, как описано в документации.
Я завершу ваш пример в следующем.

import 'dart:isolate';

main() async {
  final receivePort = ReceivePort();
  await Isolate.spawn(echo, receivePort.sendPort);

  final Stream receivePortStream = receivePort.asBroadcastStream();

  receivePortStream.listen((message) {
    if (message is String) {
      print('Message from listener: $message');
    } else if (message is num) {
      print('Computation result: $message');
    }
  });

  final firstMessage = await receivePortStream.first;
  print(firstMessage);
}

echo(SendPort sendPort) {
  sendPort.send('hello');

  sendPort.send('another one');

  final computationResult = 27 * 939;
  sendPort.send(computationResult);
}

Обратите внимание, что вы хотите просто отправить 'hello', а не какой-либо другой ReceivePort, который даже не будет работать, поскольку не является примитивным значением.
В моем примере я также настроил другого слушателя, который будет обрабатывать дальнейшие сообщения.

Кроме того, мне нужно было создать переменную receivePortStream в качестве широковещательного потока, чтобы иметь возможность прослушивать ее и для получения первого сообщения. Если вы попытаетесь запустить ReceivePort.listen и ReceivePort.first на одном и том же ReceivePort, вы получите исключение.

...