我正在为一家德国公司评估Dart,将各种Java程序移植到Dart,并对结果进行比较和分析。在浏览器中,飞镖轻松获胜。对于服务器来说,软件性能似乎是一个严重的问题(请看我的这个问题),但这基本上得到了缓解。
现在我正在移植一些“简单”的命令行工具,我没想到会有任何严重的问题,但至少有一个问题。一些工具确实会发出HTTP请求来收集一些数据,独立的Dart虚拟机只以异步方式支持它们。纵观所有我能找到的,似乎不可能在一个主要是同步的软件中使用任何异步调用。
我知道我可以将可用的同步软件重组为异步软件。但是这会将一个设计良好的软件转变为可读性更低、调试和维护更困难的东西。对于某些软件来说,这是没有意义的。我的问题是:有没有一种(我忽略的)方法可以将异步调用嵌入到同步调用的方法中?
我想提供一个系统调用并不难,只能在主线程内使用,它只是将执行转移到整个排队的异步函数调用列表中(而不必首先结束主线程),一旦最后一个被执行就返回并继续主线程。
可能如下所示:
var synchFunction() {
var result;
asyncFunction().then(() { result = ...; });
resync(); // the system call to move to and wait out all async execution
return result;
}
拥有这样的方法也会简化libAPI。大多数“同步”调用都可以被删除,因为重新同步调用可以完成这项工作。这似乎是一个合乎逻辑的想法,我仍然认为它以某种方式存在,我错过了它。或者有没有一个严重的原因让它不能工作?
考虑到这一点,我的第一个建议可以这样加强:
var synchFunction() {
var result;
asyncFunction()
.then(() { result = ...; })
.whenComplete(() { continueResync() }); // the "Done" message
resync(timeout); // waiting with a timeout as maximum limit
// Either we arrive here with the [result] filled in or a with a [TimeoutException].
return result;
}
resync()
的作用与结束隔离的main
method后通常发生的相同,它开始执行排队的异步函数(或等待事件使其可执行)。一旦遇到continueResync()
调用,就会设置一个标志,停止此异步执行,然后resync(。如果在给定的
超时
期间未遇到continueResync()
call,则也会中止异步执行,并使
对于一些受益于直接同步编程的软件组(不是客户端软件,也不是服务器软件),这样的功能将为必须处理异步库的程序员解决许多问题。
我相信我也在下面的
lm
的论证中找到了主要论点的解决方案。因此,我的问题仍然与我提出的这个“增强”解决方案有关:有没有什么东西真的使得在Dart中实现它变得不可能?
resync
函数无法在Dart的当前执行模型中实现。
异步执行具有传染性。同步函数必须在执行任何其他异步事件之前返回,因此无法同步等待异步执行。
Dart中的执行是单线程和基于事件的。如果resync
函数不阻塞同一隔离中的所有其他执行,则无法阻止它,因此挂起的异步操作永远不会发生。
要阻止同步执行,并继续执行其他操作,您需要保留到该点的整个调用堆栈,并在同步操作完成后恢复它。如果你有这样的功能,那么可能有比未来和流更好的方法:)
此外,在基于事件的系统中,等待“全异步执行”不是很好定义的。可能会有一个广播流发出来自网络的事件、一个定期计时器或一个从另一个隔离区获取数据的接收端口,或者其他一些您不能等待的事件源,因为它们来自隔离区之外,或事件过程。当当前隔离关闭时,它可能会向另一个隔离发送最终关闭消息,因此实际上“异步执行”并没有结束,直到该隔离终止。
使用异步/await 语法,您将无法获得同步操作,但编写类似的异步操作会更容易:
function() async {
var result = await asyncFunction();
return result;
}
它不会等待未反映在< code>asyncFunction返回的< code>Future中的异步操作,但这是< code>asyncFunction的工作,直到其操作完成才完成。
是的,这已经很晚了,但我认为这是一个很酷的功能,新人应该知道。
有一种方法,但Dart文档警告不要这样做(它在某种程度上是“实验性的”,尽管没有真正讨论其含义)。
waitFor
命令。
基本上,您传入一个异步函数,该函数返回Future
、一个可选的超时
parameter,然后
例如:
final int number = waitFor<int>(someAsyncThatReturnsInt);
唯一可以将异步方法包装在同步方法中时,才不需要获取返回值。
例如,如果您想禁用“保存”按钮,将结果异步保存到服务器,并在作业完成后重新启用“保存”按钮,您可以这样写:
Future<bool> save() async {
// save changes async here
return true;
}
void saveClicked() {
saveButton.enabled = false;
save()
.then((success) => window.alert(success ? 'Saved' : 'Failed'))
.catchError((e) => window.alert(e))
.whenComplete(() { saveButton.enabled = true; });
}
请注意,saveClicked
方法是完全同步的,但异步执行sav
方法。
请注意,如果进行 saveClicked
异步,则不仅必须使用异步模式调用它,而且整个方法主体将异步运行,因此当函数返回时,保存按钮不会被禁用。
为了完整起见,保存单击
的异步版本如下所示:
Future<Null> saveClicked() async {
saveButton.enabled = false;
try {
bool success = await save();
window.alert(success ? 'Saved' : 'Failed');
}
catch (e) {
window.alert(e);
}
finally {
saveButton.enabled = true;
}
}
异步操作在线程中执行,与主应用程序线程分开。当应用程序调用方法异步执行操作时,应用程序可以在异步方法执行其任务时继续执行。 示例 下面通过一个例子来理解这个概念。在示例程序中使用IO库接受用户输入。 是一种同步方法。它将阻止执行函数调用之后的所有指令,直到方法完成执行。 等待输入。它停止执行并且在收到用户输入之前不再执行任何操作。 以上示例将产生以下输出 - 在计算中,当某个事件在继续之前等待事件
同步调用异步方法最安全的方法是什么?
问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调
我试图利用stack_trace提供的Chain对象,如下所示: 我得到更多的预期输出: 我做错什么了吗?Chain与整个Async/Await不兼容吗?
我是web服务开发的初学者。我们正在使用Spring3用java构建RESTWeb应用程序。 我们正在使用的Web服务具有异步登录方法。我们为他们提供了一个回调监听器URL,他们的服务在其中发回响应。 因此,当我们发送登录请求时,我们会收到一个空白响应作为确认。和服务发送一个响应,其中包含侦听器URL上的实际数据。 请帮助,我应该如何设计/实现调用登录服务作为同步调用?谢谢 编辑:下面是回发消息的