2016-09-11 10 views
2

次のコードでは、チェーン内のlambdaのいずれもそのような型を返さない場合、変数tに正しいタスクが割り当てられているのはなぜですか?ラムダはtask<http_response>task<json::value>を返します。チェーンの最後のタスクは何ですか? - C++ rest sdk?

コードは、最後のラムダがタスクを返し、何も返さないときに機能します。

これについていくつかの光を当ててくれるオンラインドキュメントへの任意のポインタが評価されます。

ありがとうございました。

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

これは何[...]ですか? –

+0

[...]は、主にjsonからのデータの抽出を主に行うコードを表しています。そこに作成/返されたどのようなタスクもありません。私はそれに応じて投稿を更新した。 – bdristan

答えて

2

then常に見hereを取り、タスクのいくつかの種類を返します。 thenに返されたコールバックが何も返さない場合thentask<void>を返します。ナットシェルで 、thenthen

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(); 

、何に見てみましょう

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

はそれがきちんとしていない:あなたはco_awaitを使うとどうなりますか?連鎖全体が同期コードに崩壊しましたが、コードはまだ舞台裏では非同期です!

+0

私は "返されたタスクの結果タイプは、_Funcが返すものによって決定されます"というドキュメントでは逃しました。ありがとう。 – bdristan

関連する問題