Czasem zdalne wywołania procedur wymagają więcej niż jednego wyniku do zakończenia żądań. Domyślnie protokół WAMP 1.0 nie obsługuje wyników częściowych w wywołaniu — jest to funkcja dostępna wyłącznie w bibliotece sgcWebSockets.
Przepływ jest bardzo podobny do prostego wywołania RPC, jednak tutaj przed finalnym wywołaniem CallResult pojawia się jeden lub więcej wyników częściowych.
Ogólnie rzecz biorąc, klient wysyła żądanie procedury do serwera, a serwer może odesłać wynik lub błąd. Jeśli odsyła wynik, może to być wynik końcowy lub musi odesłać więcej wyników później. Jeśli jest to wynik końcowy, zostanie wywołana metoda CallResult i proces dobiegnie końca. Jeśli jest więcej wyników do wysłania, zostanie wywołana metoda CallProgressResult.
Przykład: klient żąda od serwera metody, która będzie zwracać czas serwera co sekundę i zatrzyma się po 20 wiadomościach.
Serwer WAMP
procedure OnServerCall(Connection: TsgcWSConnection; const CallId, ProcUri, Arguments: string); var vNum: Integer; begin if ProcUri = 'GetProgressiveTime' then begin vNum := StrToInt(Arguments); for i := 1 to vNum do begin if i = 20 then oServerWAMP.CallResult(CallId, FormatDateTime('yyyymmdd hh:nn:ss', Now)) else oServerWAMP.CallProgressiveResult(CallId, FormatDateTime('yyyymmdd hh:nn:ss', Now)); end end else oServer.WAMP.CallError(CallId, 'Unknown method'); end;oServer := TsgcWebSocketServer.Create(nil); oServer.Port := 80; oServerWAMP := TsgcWSPServer_WAMP.Create(nil); oServerWAMP.OnCall := OnServerCallEvent; oServerWAMP.Server := oServer; oServer.Active := True;
Klient WAMP
procedure OnCallResultClient(Connection: TsgcWSConnection; CallId, Result: string); begin ShowMessage(Result); end;procedure OnCallProgressResultClient(Connection: TsgcWSConnection; CallId, Result: string); begin ShowMessage(Result); end;procedure OnCallErrorClient(Connection: TsgcWSConnection; const Error: string); begin ShowMessage(Error); end;oClient := TsgcWebSocketClient.Create(nil); oClient.Host := '127.0.0.1'; oClient.Port := 80; oClientWAMP := TsgcWSPClient_WAMP.Create(nil); oClientWAMP.OnCallResult := OnCallResultClient; oClientWAMP.OnCallProgressResult := OnCallProgressResultClient; oClientWAMP.OnCallError := OnCallErrorClient; oClientWAMP.Client := oClient; oClient.Active := True; // After client has connected, request GetTime from server oClientWAMP.Call('GetProgressTime');