Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 执行期货,直到参数变为真_Dart_Dart Async - Fatal编程技术网

Dart 执行期货,直到参数变为真

Dart 执行期货,直到参数变为真,dart,dart-async,Dart,Dart Async,我使用未来的requestServer向服务器发出请求。 我希望在请求完成时轮询一个系统,以获取从false传递到true的特定值,并在完成时返回 代码可能是这样的,但同步和检查操作是异步的吗 返回requestServer.thenoperation{ var done=false; 完成时 返回checkOperationoperation.thenresult{ 完成=结果==真; }; 睡眠10; } }; 有什么想法吗?我想这并不是你想要的,但据我所知,没有办法阻止执行,所以你必须使用

我使用未来的requestServer向服务器发出请求。 我希望在请求完成时轮询一个系统,以获取从false传递到true的特定值,并在完成时返回

代码可能是这样的,但同步和检查操作是异步的吗

返回requestServer.thenoperation{ var done=false; 完成时 返回checkOperationoperation.thenresult{ 完成=结果==真; }; 睡眠10; } };
有什么想法吗?

我想这并不是你想要的,但据我所知,没有办法阻止执行,所以你必须使用回调

无效主列表参数{ //投票 新定时器。周期新持续时间微秒:100,t{ 伊菲斯顿{ t、 取消; 一些回调; } }; //将来有时将isDone设置为true new Future.delayednew Durationseconds:10,=>isDone=true; } bool-isDone=false; 无效回调{ 打印“isDone:$isDone”; //继续处理 }
当然,您可以将回调作为参数传递,而不是硬编码,因为函数是Dart中的第一类成员。

我想这并不完全是您想要的,但据我所知,无法阻止执行,因此您必须使用回调

无效主列表参数{ //投票 新定时器。周期新持续时间微秒:100,t{ 伊菲斯顿{ t、 取消; 一些回调; } }; //将来有时将isDone设置为true new Future.delayednew Durationseconds:10,=>isDone=true; } bool-isDone=false; 无效回调{ 打印“isDone:$isDone”; //继续处理 }
当然,您可以将回调作为参数传递,而不是硬编码,因为函数是Dart中的第一类成员。

轮询在异步中不起作用。最好等待必须完成的事情发出信号

居恩特·泽克鲍尔的回答告诉你如何通过定时器取样进行投票

作为替代方案,最好不要完成布尔运算,而是在准备好后完成另一个未来。这是一个繁忙的轮询,当结果返回时会再次轮询,这可能比您需要的更密集。如果您不需要尽快获得结果,那么使用基于计时器的轮询会更有效

返回requestServer.thenoperation{ 变量完成符=新完成符; 无效结果{ 如果!结果{ operation.thenpoll,onError:completer.completeError; }否则{ 完成的; } } 花粉假; 返回completer.future; };
代码没有经过真正的测试,因为我没有您的requestServer。

轮询在异步中不起作用。最好等待必须完成的事情发出信号

居恩特·泽克鲍尔的回答告诉你如何通过定时器取样进行投票

作为替代方案,最好不要完成布尔运算,而是在准备好后完成另一个未来。这是一个繁忙的轮询,当结果返回时会再次轮询,这可能比您需要的更密集。如果您不需要尽快获得结果,那么使用基于计时器的轮询会更有效

返回requestServer.thenoperation{ 变量完成符=新完成符; 无效结果{ 如果!结果{ operation.thenpoll,onError:completer.completeError; }否则{ 完成的; } } 花粉假; 返回completer.future; };
代码没有经过真正的测试,因为我没有您的requestServer。

当您想要生成返回未来的函数时,有时使用补足符是很有用的。认为requestServer也存在于未来,因此您将在未来面临威胁

返回requestServer.thenoperation{ //这是必要的,然后您想要控制异步 //函数。 完成者完成者=新完成者; // 新计时器。周期常数持续时间秒:10,\u{ 检查操作Operation.thenresult{ //只有当结果为真时,才传递信号 //手术已经结束。 //如果需要,也可以使用“completer.completeresult” //在未来内部传递数据。 如果结果==true completer.complete; }; }; //你马上就能回到未来。 //它将由requestServer返回; 返回completer.future; };
当您想要生成返回未来的函数时,有时使用补足符是很有用的。认为requestServer也存在于未来,因此您将在未来面临威胁

返回requestServer.thenoperation{ //这是必要的,然后您想要控制异步 //函数。 完成者完成者=新完成者; // 新计时器。周期常数持续时间秒:10,\u{ 检查操作Operation.thenresult{ //只有当结果为真时,才传递信号 //那是歌剧吗 这项工作已经完成。 //如果需要,也可以使用“completer.completeresult” //在未来内部传递数据。 如果结果==true completer.complete; }; }; //你马上就能回到未来。 //它将由requestServer返回; 返回completer.future; };
我在TestUtil库中使用如下函数:

编辑:

请注意,如果您在testWidgets测试中使用此功能,则必须做一些额外的工作,因为它依赖于实际发生的异步工作:

  await tester.runAsync<bool>(
      () => TestUtil.waitUntilTrue(() => myObj.isLoaded),
      additionalTime: Duration(seconds: 5));

我在TestUtil库中使用如下函数:

编辑:

请注意,如果您在testWidgets测试中使用此功能,则必须做一些额外的工作,因为它依赖于实际发生的异步工作:

  await tester.runAsync<bool>(
      () => TestUtil.waitUntilTrue(() => myObj.isLoaded),
      additionalTime: Duration(seconds: 5));

谢谢,这两种方法各有利弊。我会考虑哪种方法最适合我的需要。谢谢,这两种方法各有利弊。我会考虑什么才是最适合我需要的。你的第一句话并不完全正确。这是你的例子,但你可以做的只是返回新的未来=>computation;让一个函数返回一个未来,而不显式地使用补足符。你的第一句话不完全正确,这是你的例子,但你可以做返回新未来=>计算;使函数返回未来而不显式使用补足符。
  await tester.runAsync<bool>(
      () => TestUtil.waitUntilTrue(() => myObj.isLoaded),
      additionalTime: Duration(seconds: 5));