11
11
from ipywidgets import DOMWidget , Output
12
12
from traitlets import Unicode , Integer
13
13
from ._frontend import module_name , module_version
14
- import asyncio
14
+ from asyncio import ensure_future , Future
15
15
16
16
17
17
class NaoRobotService ():
@@ -36,33 +36,20 @@ def _create_msg(self, method_name, *args, **kwargs):
36
36
self .widget .request_id += 1
37
37
return data
38
38
39
- def call_service (self , method_name , * args , ** kwargs ):
40
- data = self ._create_msg (method_name , * args , ** kwargs )
41
- self .widget .send (data )
42
39
43
- async def async_call_service (self , method_name , * args , ** kwargs ):
40
+ async def call_service (self , method_name , * args , ** kwargs ):
44
41
data = self ._create_msg (method_name , * args , ** kwargs )
45
42
self .widget .send (data )
46
43
request_id = data ['requestID' ]
47
44
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 )
57
47
58
- return response
48
+ return future
59
49
60
50
61
51
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 ))
66
53
67
54
68
55
class NaoRobotWidget (DOMWidget ):
@@ -95,7 +82,7 @@ def _handle_frontend_msg(self, model, msg, buffer):
95
82
96
83
97
84
def wait_for_change (widget , value_name , output = Output (), request_id = 0 ):
98
- future = asyncio . Future ()
85
+ future = Future ()
99
86
widget .response [request_id ] = {
100
87
'isError' : False ,
101
88
'data' : None
@@ -108,17 +95,19 @@ def get_value_change(change):
108
95
widget .unobserve (get_value_change , names = value_name )
109
96
110
97
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' ]))
112
102
output .append_stderr (str (response ['data' ]) + '\n ' )
113
103
else :
114
- future .set_result (response ['data' ])
104
+ if not future .done ():
105
+ future .set_result (response ['data' ])
115
106
output .append_stdout (str (response ['data' ]) + '\n ' )
116
107
117
- else :
118
- future .set_result (change )
119
108
120
109
widget .observe (get_value_change , names = value_name )
121
- return future
110
+ return future
122
111
123
112
124
113
def connect (self , ip_address = 'nao.local' , port = '80' ):
0 commit comments