当前位置: 首页 > 知识库问答 >
问题:

异步函数返回异步元数据(包括结果),而不是只返回结果

贺刚毅
2023-03-14

我正在用。NET Core3.1编写一个API。 这个API有一个名为getSomeProperty()的异步函数,我在一个endpoint(名为get)中使用它。

当从该endpoint接收响应时,results属性被“下移”一层,并包装在来自异步方法的元数据中,如下所示:

"results": [
    {
        "result": {//actual result here}
        "id": 1,
        "status": 5,
        "isCanceled": false,
        "isCompleted": true,
        "creationOptions": 0,
        "isFaulted": false
    },
    {
        "result": {//actual result here}
        "id": 2,
        "status": 5,
        "isCanceled": false,
        "isCompleted": true,
        "creationOptions": 0,
        "isFaulted": false
    }
]

我不希望这些结果被包装在这个“异步”包装器中。

在保持方法异步的同时,如何返回任务结果,而不是返回包含任务结果的对象?

我没有使用.result:

  1. 使用.result被认为是糟糕的做法,因为如果任务尚未完成,它会导致锁定。
  2. 我不知道把它放在哪里。 据我所知,它似乎不适合任何地方。

下面是代码(请记住,出于示例目的,它被显著地稀释和简化了):

[HttpGet]
public async Task<object> Get(string someParameter)
{   
    //Do stuff

    var things = BuildACollectionOfItems();
    var results = things.Select(x => x.IrrelevantThing).OrderBy(x => x.SomethingIrrelevant).Select(async x =>
    {
        return new
        {
            x.Id,
            SomeProperty = await GetSomeProperty(x.Id)
        };
    }).ToArray();

    return new
    {
        Results = ((IEnumerable<object>) results),
        SomeIrrelevantThing = someIrrelevantThing
    };
}

private async Task<bool> GetSomeProperty(int id)
{
    var somethingFromAServer = (await _thingProvider.GetThing()).TheProperty;

    //Do stuff here

    var thing = _context.Stuff.FirstOrDefault(x => x.Thing == somethingFromAServer);

    //Do some more stuff

    return thing.Stuff;
}

共有1个答案

董花蜂
2023-03-14

您的select返回IEnumerable (因为传递给它的是一个async函数); 您可以使用Task.WhenAll等待它们全部完成,然后解包结果:

[HttpGet]
public async Task<object> Get(string someParameter)
{   
    //Do stuff

    var things = BuildACollectionOfItems();
    var results = await Task.WhenAll(things
        .Select(x => x.IrrelevantThing)
        .OrderBy(x => x.SomethingIrrelevant)
        .Select(async x => new
        {
            x.Id,
            SomeProperty = await GetSomeProperty(x.Id)
        }));

    return new
    {
        Results = ((IEnumerable<object>) results),
        SomeIrrelevantThing = someIrrelevantThing
    };
}
 类似资料:
  • 我对Firebase/Firestore/Cloud函数相当陌生,一直在尝试一个小项目,在这个项目中,客户端应用程序调用Firebase Cloud函数来生成一些随机键(随机数),将它们添加到Firestore,成功编写后,将这些键返回到客户端应用程序。有点像随机数发生器。 客户端正确调用该函数(根据Firebase控制台),确实生成密钥,检查它们是否存在于Fi还原中,如果不添加它们。所有的工作直

  • 我试图了解异步/等待如何与promise一起工作。 据我所知,await应该是阻塞的,在上面的代码中,它似乎阻塞了返回带有原语

  • 更新 我已经读了十几篇关于这个话题的文章,但没有一篇涉及到这个基本问题。我将在本文末尾列出一个参考资料部分。 原始帖子 我对函数的理解是,它返回一个promise。 MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function 在我的程序中,我可以编写如下内容: 我

  • 从tornado.gen模块文档中我了解到,tornado.gen.Task由tornado.gen.Callback和tornado.gen.Wait组成,每个Callback/Wait对与唯一键关联。。。 因此,上面的代码将从不同的URL获取所有响应。现在我真正需要完成的是在一个http_客户端返回数据时立即返回响应。因此,如果“tornadweb.org”首先返回数据,它应该执行self.w

  • 问题内容: 就像一个人在这里问到但他的解决方案是调用其他函数 …我想知道是否有可能拥有一个不调用a的函数第二个功能基于异步请求的响应,但仅当异步请求响应时。 可能是这样的: 不调用另一个函数,这有可能吗? 我要实现的目标是拥有一个可以用一些参数调用的函数,该函数将返回异步Web服务(如FB)的响应。 问题答案: 简而言之,没有。您不能让异步函数同步返回有意义的值,因为该值当时不存在(因为它是在后台

  • 问题内容: 我在自己的类中拥有所有异步调用,因此我不想将aync’ly设置为全局变量。为此,我想从我的asunc postProcess方法返回对象,例如字符串。 能做到吗? 下面是我类的一般结构,例如,我想从onPostExecute()返回一个字符串。我看到在其他地方提到了委托,但这似乎很混乱,确定有办法为类或方法提供返回类型吗? 问题答案: 像下面这样 和听众课 你可以这样打电话

  • 问题内容: 我想在Meteor方法内调用异步函数,然后将结果从该函数返回给Meteor.call。 (怎么)可能? 问题答案: 对于这种情况,Meteor现在具有Meteor.wrapAsync()。 这是通过Stripe收费并传递回调函数的最简单方法:

  • 我正在使用带有节点的数据库。js。以下请求可以正常工作: 我想异步返回多个的结果,但以下操作失败: 然后我必须在每个元素上调用,所以在调用函数时: 然而我得到: 还有点奇怪: 我怀疑我遗漏了的工作方式,那么如何返回多个结果的已实现结果呢?