我正在用。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
:
.result
被认为是糟糕的做法,因为如果任务尚未完成,它会导致锁定。下面是代码(请记住,出于示例目的,它被显著地稀释和简化了):
[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;
}
您的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。以下请求可以正常工作: 我想异步返回多个的结果,但以下操作失败: 然后我必须在每个元素上调用,所以在调用函数时: 然而我得到: 还有点奇怪: 我怀疑我遗漏了的工作方式,那么如何返回多个结果的已实现结果呢?