问题标签 [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.

0 投票
1 回答
1462 浏览

f# - F# Async.RunSynchronously 与 timeout 和 cancelToken

当使用超时和 CancellationToken 调用 Async.RunSynchronously 时,超时值似乎被忽略了。我可以通过在 CancellationToken 上调用 CancelAfter 来解决此问题,但理想情况下,我希望能够区分工作流中发生的异常 TimeOutExceptions 和 OperationCanceledExceptions。

我相信下面的示例代码证明了这一点。

输出如下,表明超时仅在第一种情况下有效(未指定 CancelationToken)

这是预期的行为吗?有没有办法得到我所追求的行为?

谢谢!

0 投票
2 回答
986 浏览

unit-testing - 测试 F# 异步工作流时如何获得有用的堆栈跟踪

我想测试以下异步工作流程(使用 NUnit+FsUnit):

我为它写了以下测试:

由于 foo throws 我在单元测试运行器中得到以下堆栈跟踪:

不幸的是,堆栈跟踪并没有告诉我异常是在哪里引发的。它在 RunSynchronously 处停止。

我听说 Async.Catch 神奇地恢复了堆栈跟踪,所以我调整了我的测试:

现在这很丑陋,但至少它产生了一个有用的堆栈跟踪:

这次堆栈跟踪准确地显示了错误发生的位置:ExplorationTests.foo@line 71

有没有办法摆脱 Async.Catch 和两个选择之间的匹配,同时仍然获得有用的堆栈跟踪?有没有更好的方法来构建异步工作流测试?

0 投票
1 回答
1155 浏览

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 块吗?

0 投票
0 回答
217 浏览

asynchronous - 使用 BlockingQueueAgent 并行消费 asyncSeq

是时候因为对 .NET 中并发的工作原理缺乏了解而再次让自己难堪了:P

我正在尝试编写一个函数,该函数可以封装创建一个异步工作流,该工作流接受 asyncSeq 输入并将其分发给 n 个并行消费者。

我一直在用这样的代码对其进行测试,以模拟一个快速创建的序列,但每个项目的工作都需要一段时间。

编辑:我似乎已经解决了我最初的问题(呃,我真的没有想过我在用 EventWaitHandle 做什么,太傻了),但我仍然很想听听这是否是解决问题的一种完全愚蠢的方法与 F#。

0 投票
1 回答
571 浏览

asynchronous - 结合 Async 和 Option monad

最近在编写一些适用于许多嵌套异步工作流的代码时,我发现一种新出现的模式让我感到很不舒服。一个简单的例子:

'verboseFun' 对我来说似乎很冗长,但我想不出一种方法来组合 Option 和 Async monad,这样就可以在没有模式匹配的情况下重写它。我在想类似的东西

在我看来,我很可能只是不知道有哪些构建块可以实现这一目标。

编辑:托马斯回答后的额外澄清。

如果一切都是同步的,我试图适应对我来说微不足道的事情,例如,

成为嵌套异步工作流的一部分。最初我在想“只是随便做一个!在那里”所以想出了

但它立刻让我觉得不对劲,因为 VS 开始要求忽略。希望这有助于澄清。

0 投票
1 回答
481 浏览

f# - 异步计算没有捕获 OperationCancelledException

我正在尝试向 URL 发出异步 Web 请求,如果请求时间过长,该请求将返回。我正在使用 F# 异步工作流和 System.Net.Http 库来执行此操作。

但是,我无法捕获工作async流中 System.Net.Http 库引发的 Task/OperationCancelledExceptions。相反,异常是在 Async.RunSynchronously 方法中引发的,您可以在此堆栈跟踪中看到:

编码:

0 投票
1 回答
338 浏览

f# - 调用 F# 异步工作流时,是否可以避免定义临时标签?

假设我有一个异步数据源:

我可以使用let!一个临时标签来调用它:

或者,我可以使用和管道调用它(效率低下!)Async.RunSynchronously,并且没有临时标签:

我喜欢的语法,showData2但知道调用会Async.RunSynchronously占用调用线程。

是否在某处定义了语法、运算符或函数,允许我将 an 传递Async<'T>到接受的函数中'T

0 投票
1 回答
564 浏览

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/

0 投票
1 回答
236 浏览

javascript - Node js Query Async Map函数被调用

在 mapSeries 方法最终回调中的 each.save 方法调用后,我没有得到任何响应。我正在尝试这个解决方案。我将如何做同样的事情。我如何解决这个问题并处理这种情况?

0 投票
3 回答
300 浏览

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