我正在使用一个小型Web服务器,我正在使用async
包实现一个版本,并且一个同步版本在单独的隔离中执行每个请求。我想简单地将文件流传递给HttpResponse
,但我无法同步执行此操作。我找不到同步等待Stream
和Future
的方法。我现在正在使用RandomAccessFile
代替它,但它变得更加混乱。
一种解决方案是执行定期计时器以检查未来是否已完成(通过设置布尔值或类似),但这绝对不是我想要使用的。
有同步等待Future
和Stream
的方法吗?如果没有,为什么?
答案 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();
从技术上讲,这与执行同步任务可能有所不同,但是可以达到先完成一项任务再完成另一项任务的目的。