gpt4 book ai didi

c++ - 链返回中的最后一个任务应该是什么 - C++ rest sdk?

转载 作者:搜寻专家 更新时间:2023-10-31 02:14:51 24 4
gpt4 key购买 nike

在下面的代码中,为什么变量是t当链中的 lambda 都不返回这样的类型时分配正确的任务? lambdas 返回 task<http_response> , task<json::value>没有。

代码在最后一个 lambda 返回任务和什么都不返回时有效。

任何指向在线文档的指针都将不胜感激。

谢谢。

pplx::task<void> t = client.request(methods::GET, L"/api/dummy")
.then([](http_response response)
{
if (response.status_code() == status_codes::OK)
{
response.content_ready().wait();
return response.extract_json(); // return task<json::value>
}
})

.then([](json::value value)
{
if (value.has_field(L"id"))
{
int id = value.at(L"id").as_integer();
}

// t.wait() below works regardless if this
// line is commented out or not.
//return pplx::task<void>({});
});

try
{
t.wait();
}
catch (const std::exception &e)
{
[...]
}

最佳答案

then总是返回某种任务,看看here .如果回调提供给 then不返回任何东西 then只会返回 task<void> .简而言之,then将返回一个与提供给 then 的可调用函数的返回类型相对应的任务

task<T> t1 = t0.then([]{ return T(); });
task<void> t2 = t3.then([]{ /*return nothing*/ });

让我们把它分解成几个部分:

task<http_response> t0 = client.request(methods::GET, L"/api/dummy");
task<json::value value> t1 = t0.then(/*return json from response*/);
task<void> t = t1.then(/*extract "id", returns nothing*/);
t.wait();

现在,看看使用 co_await 时会发生什么:

 auto response = co_await client.request(methods::GET, L"/api/dummy");
if (response.status_code() == status_codes::OK)
{
response.content_ready().wait();
auto value = co_await response.extract_json();
if (value.has_field(L"id"))
{
int id = value.at(L"id").as_integer();
}
}

这不是很整洁吗?整个延续链只是折叠成同步代码,但代码在幕后仍然是异步的!

关于c++ - 链返回中的最后一个任务应该是什么 - C++ rest sdk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39438319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com