链中的最后一个任务应该是什么 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();
        }
    }

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