在下面的代码中,当链中的lambda都没有返回这样的类型时,为什么变量t
分配了正确的任务? lambda返回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)
{
[...]
}
答案 0 :(得分:2)
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();
}
}
不是很整洁吗?整个延续链接刚刚折叠成同步代码,但代码在幕后仍然是异步的!