1111from ipywidgets import DOMWidget , Output
1212from traitlets import Unicode , Integer
1313from ._frontend import module_name , module_version
14- import asyncio
14+ from asyncio import ensure_future , Future
1515
1616
1717class NaoRobotService ():
@@ -36,33 +36,20 @@ def _create_msg(self, method_name, *args, **kwargs):
3636 self .widget .request_id += 1
3737 return data
3838
39- def call_service (self , method_name , * args , ** kwargs ):
40- data = self ._create_msg (method_name , * args , ** kwargs )
41- self .widget .send (data )
4239
43- async def async_call_service (self , method_name , * args , ** kwargs ):
40+ async def call_service (self , method_name , * args , ** kwargs ):
4441 data = self ._create_msg (method_name , * args , ** kwargs )
4542 self .widget .send (data )
4643 request_id = data ['requestID' ]
4744
48- try :
49- self .output .clear_output ()
50- self .output .append_stdout ('Calling service... \n ' )
51- await self .widget .wait_for_change ('counter' , self .output , request_id )
52- except Exception as e :
53- return e
54-
55- response = self .widget .response [request_id ]['data' ]
56- del self .widget .response [request_id ]
45+ self .output .append_stdout (f'Calling service { self .name } ...\n ' )
46+ future = await self .widget .wait_for_change ('counter' , self .output , request_id )
5747
58- return response
48+ return future
5949
6050
6151 def __getattr__ (self , method_name ):
62- if (method_name [:6 ] == 'async_' ):
63- return lambda * x , ** y : self .async_call_service (method_name [6 :], * x , ** y )
64- else :
65- return lambda * x , ** y : self .call_service (method_name , * x , ** y )
52+ return lambda * x , ** y : ensure_future (self .call_service (method_name , * x , ** y ))
6653
6754
6855class NaoRobotWidget (DOMWidget ):
@@ -95,7 +82,7 @@ def _handle_frontend_msg(self, model, msg, buffer):
9582
9683
9784 def wait_for_change (widget , value_name , output = Output (), request_id = 0 ):
98- future = asyncio . Future ()
85+ future = Future ()
9986 widget .response [request_id ] = {
10087 'isError' : False ,
10188 'data' : None
@@ -108,17 +95,19 @@ def get_value_change(change):
10895 widget .unobserve (get_value_change , names = value_name )
10996
11097 if (response ['isError' ]):
111- future .set_exception (Exception (response ['data' ]))
98+ if not future .done ():
99+ # TODO: Fix "Task exception was never retrieved"
100+ # future.set_exception(Exception(response['data']))
101+ future .set_result (Exception (response ['data' ]))
112102 output .append_stderr (str (response ['data' ]) + '\n ' )
113103 else :
114- future .set_result (response ['data' ])
104+ if not future .done ():
105+ future .set_result (response ['data' ])
115106 output .append_stdout (str (response ['data' ]) + '\n ' )
116107
117- else :
118- future .set_result (change )
119108
120109 widget .observe (get_value_change , names = value_name )
121- return future
110+ return future
122111
123112
124113 def connect (self , ip_address = 'nao.local' , port = '80' ):
0 commit comments