构造仅在计算表达式中使用

时间:2018-03-20 23:19:49

标签: f#

我是一个异步函数,它异步返回一个字符串,我在测试方法中调用该函数,并抛出计算表达式,可能的修复方法是什么?

代码

let requestDataAsync (param: string) : Async<string> = 
    async {
        Console.WriteLine param
        return "my result"
    }

测试代码

[<TestMethod>]
member this.TestRequestDataAsync() =
    let! result = requestDataAsync("some parameter")

    Console.WriteLine(result)
    Assert.IsTrue(true)

此行let! result = requestDataAsync("some parameter")

的错误
  
    

此构造只能在计算表达式中使用

  

问题,如何等待并显示异步功能的结果?

2 个答案:

答案 0 :(得分:4)

let!的调用必须出现在计算表达式的顶层。您可以通过创建嵌套的async {}块来修复它:

[<TestMethod>]
member this.TestRequestDataAsync() =
async 
{      
    let! result = requestDataAsync("some parameter")
    Console.WriteLine(result)
    Assert.IsTrue(true)
 }

答案 1 :(得分:4)

答案是使用RunSynchronously。这样你可以等待函数调用。

$fileContent = Get-Content -LiteralPath 'c:\testlog\sevenzip.txt' -Raw

$filesToFix = [regex]::Matches($fileContent, 
                 "ERROR: (.*)\nCan not open the file as archive",
                 'Multiline') | 
    ForEach-Object {$_.Groups[1].Value}