问题标签 [async-workflow]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
f# - F# Async.RunSynchronously 与 timeout 和 cancelToken
当使用超时和 CancellationToken 调用 Async.RunSynchronously 时,超时值似乎被忽略了。我可以通过在 CancellationToken 上调用 CancelAfter 来解决此问题,但理想情况下,我希望能够区分工作流中发生的异常 TimeOutExceptions 和 OperationCanceledExceptions。
我相信下面的示例代码证明了这一点。
输出如下,表明超时仅在第一种情况下有效(未指定 CancelationToken)
这是预期的行为吗?有没有办法得到我所追求的行为?
谢谢!
unit-testing - 测试 F# 异步工作流时如何获得有用的堆栈跟踪
我想测试以下异步工作流程(使用 NUnit+FsUnit):
我为它写了以下测试:
由于 foo throws 我在单元测试运行器中得到以下堆栈跟踪:
不幸的是,堆栈跟踪并没有告诉我异常是在哪里引发的。它在 RunSynchronously 处停止。
我听说 Async.Catch 神奇地恢复了堆栈跟踪,所以我调整了我的测试:
现在这很丑陋,但至少它产生了一个有用的堆栈跟踪:
这次堆栈跟踪准确地显示了错误发生的位置:ExplorationTests.foo@line 71
有没有办法摆脱 Async.Catch 和两个选择之间的匹配,同时仍然获得有用的堆栈跟踪?有没有更好的方法来构建异步工作流测试?
exception-handling - Async.Catch 对 OperationCanceledExceptions 不起作用
我使用 Async.Catch 来处理异步工作流引发的异常:
今天我注意到 OperationCanceledExceptions 不是由 Async.Catch 处理的。异常没有从 Async.Catch 获得选择,而是不断冒泡,直到它击中我。我预计以下测试是红色的,但它是绿色的:
使用 Async.Catch + Choices + 匹配评估一些异常以及使用 try/catch 块评估其他一些异常似乎不正确......它看起来像下面这样,这太复杂了。除此之外,我想知道 Async.Catch 有什么用途,因为无论如何我都必须使用 try/catch 块......:
处理异步工作流异常的最佳方法是什么?我应该只转储 Async.Catch 并在任何地方使用 try/catch 块吗?
asynchronous - 使用 BlockingQueueAgent 并行消费 asyncSeq
是时候因为对 .NET 中并发的工作原理缺乏了解而再次让自己难堪了:P
我正在尝试编写一个函数,该函数可以封装创建一个异步工作流,该工作流接受 asyncSeq 输入并将其分发给 n 个并行消费者。
我一直在用这样的代码对其进行测试,以模拟一个快速创建的序列,但每个项目的工作都需要一段时间。
编辑:我似乎已经解决了我最初的问题(呃,我真的没有想过我在用 EventWaitHandle 做什么,太傻了),但我仍然很想听听这是否是解决问题的一种完全愚蠢的方法与 F#。
asynchronous - 结合 Async 和 Option monad
最近在编写一些适用于许多嵌套异步工作流的代码时,我发现一种新出现的模式让我感到很不舒服。一个简单的例子:
'verboseFun' 对我来说似乎很冗长,但我想不出一种方法来组合 Option 和 Async monad,这样就可以在没有模式匹配的情况下重写它。我在想类似的东西
在我看来,我很可能只是不知道有哪些构建块可以实现这一目标。
编辑:托马斯回答后的额外澄清。
如果一切都是同步的,我试图适应对我来说微不足道的事情,例如,
成为嵌套异步工作流的一部分。最初我在想“只是随便做一个!在那里”所以想出了
但它立刻让我觉得不对劲,因为 VS 开始要求忽略。希望这有助于澄清。
f# - 异步计算没有捕获 OperationCancelledException
我正在尝试向 URL 发出异步 Web 请求,如果请求时间过长,该请求将返回。我正在使用 F# 异步工作流和 System.Net.Http 库来执行此操作。
但是,我无法捕获工作async
流中 System.Net.Http 库引发的 Task/OperationCancelledExceptions。相反,异常是在 Async.RunSynchronously 方法中引发的,您可以在此堆栈跟踪中看到:
编码:
f# - 调用 F# 异步工作流时,是否可以避免定义临时标签?
假设我有一个异步数据源:
我可以使用let!
一个临时标签来调用它:
或者,我可以使用和管道调用它(效率低下!)Async.RunSynchronously
,并且没有临时标签:
我喜欢的语法,showData2
但知道调用会Async.RunSynchronously
占用调用线程。
是否在某处定义了语法、运算符或函数,允许我将 an 传递Async<'T>
到接受的函数中'T
?
c# - F# 中的 ConfigureAwait(false)
我正在使用一个用 C# 编写并使用 async/await 模式的库。在 C# 中,我可以通过调用它来等待某些东西,ConfigureAwait(false)
但是当我使用 F# 中的库时,我看不到做同样事情的方法吗?
目前我确实SomeMethodAsync() |> Async.AwaitTask
将其转换为F# 工作流,但是在调用时Async
我如何能像从 F# 一样做呢?ConfigureAwait(false)
SomeMethodAsync
编辑:
在 F# Slack 频道和一些额外的谷歌搜索中得到了一些很棒的帮助,我在这里找到了一个关于如何切换上下文的很好的解释:http: //tomasp.net/blog/async-non-blocking-gui.aspx/
javascript - Node js Query Async Map函数被调用
在 mapSeries 方法最终回调中的 each.save 方法调用后,我没有得到任何响应。我正在尝试这个解决方案。我将如何做同样的事情。我如何解决这个问题并处理这种情况?
asynchronous - 为什么我必须包装异步进入另一个异步工作流程并让!它?
我试图理解 F# 中的异步工作流,但我发现了一个我真的不明白的部分。
以下代码工作正常:
我定义了一个异步工作流,其中 TryOpenAsync 返回一个Task<StreamOpenResult>
类型。我将其转换为Async<StreamOpenResult>
Async.AwaitTask。(支线任务:“等待”任务?它不等待它只是转换它,是吗?我认为它与 Task.Wait 或 await 关键字无关)。我“等待”它let!
并返回它。要启动工作流,我使用 RunSynchronously 应该启动工作流并返回结果(绑定它)。根据结果,我检查是否找到了流。
但现在我的第一个问题。为什么我必须将 TryOpenAsync 调用包装在另一个异步计算中并让!(“等待”)呢?例如以下代码不起作用:
我认为 AwaitTask 使它成为Async<T>
并且RunSynchronously
应该启动它。然后使用结果。我想念什么?
我的第二个问题是为什么有任何“Async.Let!” 功能可用?也许是因为它不起作用或更好,为什么它不能与以下代码一起使用?
我只是将 TryOpenAsync 作为参数插入,但它不起作用。通过说不起作用,我的意思是整个 FSI 都会挂起。所以它与我的异步/“等待”有关。
- - 更新:
FSI 中的工作代码结果:
FSI 中代码无效的结果:
而且您不能再在 FSI 中执行任何操作
--- 更新 2
我正在使用 Streamstone。这里是 C# 示例:https ://github.com/yevhen/Streamstone/blob/master/Source/Example/Scenarios/S04_Write_to_stream.cs
这里是 Stream.TryOpenAsync:https ://github.com/yevhen/Streamstone/blob/master/Source/Streamstone/Stream.Api.cs#L192