Skip to content

Commit 2242cda

Browse files
author
rick
committed
chore: Add Promise-based callServiceAsync for async/await support
1 parent 5b60f74 commit 2242cda

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

packages/roslib/src/core/Service.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,29 @@ export default class Service<
9696
timeout: timeout,
9797
});
9898
}
99+
100+
/**
101+
* Wrapper of callService that returns a modern Promise-based interface for use with async/await.
102+
* @see callService
103+
* @param request - The service request to send.
104+
* @param [timeout] - Optional timeout, in seconds, for the service call. A non-positive value means no timeout.
105+
* If not provided, the rosbridge server will use its default value.
106+
*/
107+
callServiceAsync(request: TRequest, timeout?: number): Promise<TResponse> {
108+
return new Promise<TResponse>((resolve, reject) => {
109+
this.callService(
110+
request,
111+
(res) => {
112+
resolve(res);
113+
},
114+
(err) => {
115+
reject(new Error(err));
116+
},
117+
timeout,
118+
);
119+
});
120+
}
121+
99122
/**
100123
* Advertise the service. This turns the Service object from a client
101124
* into a server. The callback will be called with every request

packages/roslib/test/service.test.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,4 +203,24 @@ describe("Service", () => {
203203
await server.unadvertise();
204204
expect(server.isAdvertised).toBe(false);
205205
});
206+
207+
it("Successfully call /rosapi/get_time with an async return", async () => {
208+
const emptyRequest = {};
209+
210+
const getTimeService = new Service<
211+
typeof emptyRequest,
212+
{
213+
time: { sec: number; nanosec: number };
214+
}
215+
>({
216+
ros,
217+
serviceType: "rosapi_msgs/srv/GetTime",
218+
name: "/rosapi/get_time",
219+
});
220+
221+
const response = await getTimeService.callServiceAsync(emptyRequest);
222+
223+
expect(response.time.sec).toBeDefined();
224+
expect(response.time.nanosec).toBeDefined();
225+
});
206226
});

0 commit comments

Comments
 (0)