Skip to content

useService

ROS サービスクライアントをラップします。useTopic と異なり呼び出しは命令的です。必要なタイミングで callService を呼び出し、loading / result / error が直近の呼び出し結果を反映します。

tsx
import { useService } from "roshooks";

interface AddTwoIntsRequest {
  a: number;
  b: number;
}

interface AddTwoIntsResponse {
  sum: number;
}

const { callService, loading, result, error } = useService<AddTwoIntsRequest, AddTwoIntsResponse>({
  name: "/add_two_ints",
  serviceType: "rospy_tutorials/AddTwoInts",
});

オプション

オプション説明
namestringサービス名(例: "/add_two_ints")。
serviceTypestringサービス型(例: "rospy_tutorials/AddTwoInts")。

返り値

フィールド説明
callService(request: TRequest, timeout?: number) => Promise<TResponse>サービスを呼び出します。成功時はレスポンスで resolve、失敗時は rosbridge のエラーメッセージを包んだ Error で reject します。
loadingboolean呼び出し中は true
resultTResponse | null直近の成功時のレスポンス。
errorstring | null直近の失敗時のエラーメッセージ。
serviceService<TRequest, TResponse> | nullroslib.js の Service インスタンス本体。生成前は null

使用例

tsx
function AddTwoInts() {
  const { callService, loading, result, error } = useService<AddTwoIntsRequest, AddTwoIntsResponse>({
    name: "/add_two_ints",
    serviceType: "rospy_tutorials/AddTwoInts",
  });

  return (
    <div>
      <button disabled={loading} onClick={() => callService({ a: 2, b: 3 }).catch(() => {})}>
        2 + 3
      </button>
      {result && <p>sum: {result.sum}</p>}
      {error && <p role="alert">{error}</p>}
    </div>
  );
}

TIP

callService は Promise を返すため、呼び出しが失敗して誰も await/catch していないと unhandled rejection になり得ます。try/catchawait するか、error フィールドだけを使いたい場合は no-op の .catch() を付けておいてください。

実サーバーなしでサービスの応答をシミュレートする方法は テストの書き方 を参照してください。

Released under the BSD-3 License.