Thank Kento a lot.
That's work for me!

Vào lúc 20:52:34 UTC+7 ngày Thứ Hai, 12 tháng 9, 2022, 
ken...@cloudflare.com đã viết:

> Hi Thuy,
>
> Your code doesn't work because it tries to use nested WaitScopes. When a 
> server-side method is called, the event loop is already running, so you 
> have to use promise.then(lambda) instead of promise.wait(waitScope).
>
> So instead of this:
>
>     auto& waitScope = ezClient2.getWaitScope();
>     {
>       auto request = client2.functionSampleRequest();  //Request to SERVER2
>       request.setIn(222);
>       auto promise = request.send();
>      
>       promise.wait(waitScope);
>       
>     }
>
>     return kj::READY_NOW;
>
> Try:
>
>     auto request = client2.functionSampleRequest();  //Request to SERVER2
>     request.setIn(222);
>     return request.send()
>         .then([context](capnp::Response<Server2::SampleRequestResult> 
> response) {
>       // You can handle the response from server2 here if you want.
>       // If there's nothing to do, you can replace `.then()` with 
> `.ignoreResult()`.
>     })
>
> -Kenton
>
> On Mon, Sep 12, 2022 at 2:40 AM Thuy Doan <huut...@gmail.com> wrote:
>
>> Hi all,
>>
>> I am a newbie to CapnProto. I'd like to have your help.
>>
>> I want to request a function of server2 in the callback of server1.
>> But I got an exception like below.
>> Please help me resolve it.
>> Many thanks!
>>
>> * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS 
>> (code=1, address=0x3000000000020)
>>   * frame #0: 0x000000010035859c 
>> libcapnp-rpc-0.10.2.dylib`capnp::VatNetwork<capnp::rpc::twoparty::VatId, 
>> capnp::rpc::twoparty::ProvisionId, capnp::rpc::twoparty::RecipientId, 
>> capnp::rpc::twoparty::ThirdPartyCapId, 
>> capnp::rpc::twoparty::JoinResult>::baseConnect(capnp::AnyStruct::Reader) + 20
>>     frame #1: 0x0000000100361a2c 
>> libcapnp-rpc-0.10.2.dylib`kj::_::TransformPromiseNode<kj::_::Void, 
>> kj::Own<kj::AsyncIoStream>, capnp::EzRpcClient::Impl::Impl(kj::StringPtr, 
>> unsigned int, capnp::ReaderOptions)::'lambda'(kj::Own<kj::AsyncIoStream>&&), 
>> kj::_::PropagateException>::getImpl(kj::_::ExceptionOrValue&) + 512
>>     frame #2: 0x00000001004d2220 
>> libkj-async-0.10.2.dylib`kj::_::RunnableImpl<kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&)::$_31>::run()
>>  + 32
>>     frame #3: 0x000000010028aaa4 
>> libkj-0.10.2.dylib`kj::_::runCatchingExceptions(kj::_::Runnable&) + 40
>>     frame #4: 0x00000001004c7e48 
>> libkj-async-0.10.2.dylib`kj::_::TransformPromiseNodeBase::get(kj::_::ExceptionOrValue&)
>>  + 64
>>     frame #5: 0x00000001004c8684 
>> libkj-async-0.10.2.dylib`kj::_::ForkHubBase::fire() + 60
>>     frame #6: 0x00000001004c654c 
>> libkj-async-0.10.2.dylib`kj::_::waitImpl(kj::Own<kj::_::PromiseNode>&&, 
>> kj::_::ExceptionOrValue&, kj::WaitScope&, kj::SourceLocation) + 608
>>     frame #7: 0x0000000100005198 
>> client`kj::Promise<capnp::Response<SampleServer1::CallbackRegisterResults> 
>> >::wait(kj::WaitScope&, kj::SourceLocation) + 120
>>     frame #8: 0x0000000100004b94 client`main + 344
>>     frame #9: 0x000000010003d08c dyld`start + 520  
>>
>> *Sample source code as below*
>>
>> *SampleServer1.capnp:*
>>
>> interface SampleServer1 {
>>
>>     callbackRegister @0 (callback :Callback) -> ();   //to register a 
>> callback
>>
>>     interface Callback {
>>         calbackFunc @0 (in :Int32) -> ();
>>     }
>> }
>>
>> *SampleServer1::Server Impl:*
>>
>> class SampleServer1Impl : public SampleServer1::Server
>> {
>> ::kj::Promise<void> callbackRegister(CallbackRegisterContext context){
>>     auto cb = context.getParams().getCallback());
>>
>>     auto request = cb.calbackFuncRequest();   //Call callback function
>>     request.setIn(111);
>>     auto promise = request.send();
>>
>>     return kj::READY_NOW;
>>   }
>> }
>>
>> *SampleServer1::Callback::Server Impl:*
>>
>> class CallbackImpl : public SampleServer1::Callback::Server
>> {
>> ::kj::Promise<void> calbackFunc(CalbackFuncContext context){
>>
>>     capnp::EzRpcClient ezClient2("unix:/tmp/capnp-server-2");
>>     Server2::Client client2 = ezClient2.getMain<SampleServer2>();
>>
>>     auto& waitScope = ezClient2.getWaitScope();
>>     {
>>       auto request = client2.functionSampleRequest();  //Request to SERVER2
>>       request.setIn(222);
>>       auto promise = request.send();
>>      
>>       promise.wait(waitScope);
>>       
>>     }
>>
>>     return kj::READY_NOW;
>>   }
>> }
>>
>> *SampleServer2.capnp:*
>>
>> interface SampleServer2 {
>>
>>     functionSample @0 (in :Int32) -> ();
>> }
>>
>> *SampleServer2::Server impl*
>>
>> class SampleServer2 Impl : public SampleServer2::Server
>> {
>> ::kj::Promise<void> functionSample(FunctionSampleContext context){
>>     //Do something
>>     return kj::READY_NOW;
>>   }
>> }
>>
>> *Client implement*
>>
>>   capnp::EzRpcClient ezClient("unix:/tmp/capnp-server-1");
>>   Subscriber::Client client = ezClient.getMain<SampleServer1>();
>>   auto& waitScope = ezClient.getWaitScope();
>>
>>  ::SampleServer1::Callback::Client callback = 
>> ::SampleServer1::Callback::Client(kj::heap<CallbackImpl>());
>>
>>   auto request = client.callbackRegisterRequest();      //Register a 
>> callback to Server1
>>   request.setCallback(callback);
>>   auto promise = request.send();
>>
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Cap'n Proto" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to capnproto+...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/capnproto/CAJ0niqqYEedcQ1aCaHMv%2Bdw9%3Dzdb1RYKa1y2oQCtbBSTKLqN2g%40mail.gmail.com
>>  
>> <https://groups.google.com/d/msgid/capnproto/CAJ0niqqYEedcQ1aCaHMv%2Bdw9%3Dzdb1RYKa1y2oQCtbBSTKLqN2g%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Cap'n Proto" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to capnproto+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/capnproto/89e7bd31-1cb0-4027-954c-0621a5b2a6a8n%40googlegroups.com.

Reply via email to