链中的最后一项任务应该返回 - c ++ rest sdk?

时间:2016-09-11 16:37:26

标签: c++ rest casablanca

在下面的代码中,当链中的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)
{
    [...]
}

1 个答案:

答案 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();
        }
    }

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