链中的最后一个任务应该是什么 return - C++ rest sdk?
What should last task in a chain return - c++ rest sdk?
在下面的代码中,为什么变量 t
分配了正确的任务,而链中的 lambdas return 都不是这样的类型? lambdas return task<http_response>
、task<json::value>
和 none.
代码在最后一个 lambda return 任务和它 return 什么都没有的时候工作。
任何指向在线文档的指针都将不胜感激。
谢谢。
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
总是return某种任务,看看here。如果提供给 then
的回调没有 return 任何 then
将只是 return task<void>
。
简而言之,shell、then
将 return 一个与提供给 then
的可调用对象的 return 类型相对应的任务
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();
}
}
是不是很整洁?整个延续链只是折叠成同步代码,但代码在幕后仍然是异步的!
在下面的代码中,为什么变量 t
分配了正确的任务,而链中的 lambdas return 都不是这样的类型? lambdas return task<http_response>
、task<json::value>
和 none.
代码在最后一个 lambda return 任务和它 return 什么都没有的时候工作。
任何指向在线文档的指针都将不胜感激。
谢谢。
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
总是return某种任务,看看here。如果提供给 then
的回调没有 return 任何 then
将只是 return task<void>
。
简而言之,shell、then
将 return 一个与提供给 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();
}
}
是不是很整洁?整个延续链只是折叠成同步代码,但代码在幕后仍然是异步的!