同步等待Dart中的Future或Stream完成

时间:2013-07-25 08:45:07

标签: dart

我正在使用一个小型Web服务器,我正在使用async包实现一个版本,并且一个同步版本在单独的隔离中执行每个请求。我想简单地将文件流传递给HttpResponse,但我无法同步执行此操作。我找不到同步等待StreamFuture的方法。我现在正在使用RandomAccessFile代替它,但它变得更加混乱。

一种解决方案是执行定期计时器以检查未来是否已完成(通过设置布尔值或类似),但这绝对不是我想要使用的。

有同步等待FutureStream的方法吗?如果没有,为什么?

2 个答案:

答案 0 :(得分:1)

AFAIK没有一种方法可以同步等待Future或Stream。为什么?因为它们在定义上非常异步,并且正如您所发现的那样,API在设计时考虑了异步行为。

有一些Future构造函数Future.value()Future.sync()会立即执行,但我不认为这些可能是您的想法。

答案 1 :(得分:0)

对于将来来这里的游客仅希望在Future或Stream完成后执行一些任务,请在异步方法中使用<?php include_once './swift/lib/swift_required.php'; ?> <html> <head> <title> Mailer Tester </title> </head> <body> <form method="post"> <input type="text" name="to" placeholder="To:" required><br> <input type="text" name="subject" placeholder="Subject:" required><br> <textarea name="bodys" placeholder="Body" required></textarea><br> <small>Here, write noreply for noreply.patsite@gmail.com<br>support for support.patsite@gmail.com<br>noreply for norepy.patsite@gmail.com</small><br> <input type="text" name="from" value="noreply" placeholder="From:" required> <input type="submit" value="Submit"> </form> </body> </html> <?php //proccess data if(isset($_POST['to'])&&$_POST['to']!="") $to = $_POST['to']; if(isset($_POST['subject'])&&$_POST['subject']!="") $subject = $_POST['subject']; if(isset($_POST['bodys'])&&$_POST['bodys']!="") $body = $_POST['bodys']; if(isset($_POST['from'])&&$_POST['from']!="") $from = $_POST['from']; if(isset($to)&&isset($subject)&&isset($body)&&isset($from)) { //mail if($from == "noreply") { $transport = (new Swift_SmtpTransport('smtp.example.org', 25)) ->setUsername('noreply.patsite@gmail.com') ->setPassword('lol') ; // Create the Mailer using your created Transport $mailer = new Swift_Mailer($transport); // Create a message $message = (new Swift_Message('$subject')) ->setFrom(['noreply.patsite@gmail.com' => 'Patsite']) ->setTo([$to]) ->setBody($body) ; // Send the message $result = $mailer->send($message); echo $result; } } ?> await

未来

await for

final myInt = await getFutureInt();

注意

从技术上讲,这与执行同步任务可能有所不同,但是可以达到先完成一项任务再完成另一项任务的目的。