Italian Sub e Resumable Sub

Elric

Well-Known Member
Licensed User
Ciao,

una Sub può restituire un valore:
4.5.6 Returned value
A sub can return a value, this can be any object.
Returning a value is done with the Return keyword.
The type of the return value is added after the parameter list.
B4X:
Sub CalcInterest(Capital As Double, Rate As Double) As Double
   Return Capital * Rate / 100
End Sub
(fonte: B4X Basic Language)

Ma se io, all'interno di questa sub ci metto un Wait For una Resumable Sub mi restituisce il seguente errore "Resumable subs return type must be ResumableSub (or none).", ad esempio:
B4X:
Sub CalcInterestWithSpread(Capital As Double, Rate As Double) As Double
    Dim myJob As HttpJob
    myJob.Initialize("", Me)
    ...
    myJob.Download($"${URLWhereICanDownloadTheSpread}"$)

    Wait For (myJob) JobDone(myJob As HttpJob)
    ...
    Return Capital * Rate * Spread/ 100
End Sub
(questo è solo un esempio basato a sua volta sull'esempio presente nel booklet. Ho inserito nell'esempio HttpJob perché è quello per cui faccio fatica a trovare un workaround).

Pare che l'alternativa sia rendere anche la Sub CalcInterestWithSpread ResumableSub, ossia
B4X:
Sub CalcInterestWithSpread(Capital As Double, Rate As Double) As ResumableSub
    Private Spread As String
    Private myJob As HttpJob
    myJob.Initialize("", Me)
    ...
    myJob.Download($"${URLWhereICanDownloadTheSpread}"$)

    Wait For (myJob) JobDone(myJob As HttpJob)
    Spread = myJob.GetString
    ...
    Private interest as Double = Capital * Rate * Spread/ 100
    Return interest
End Sub

Questo, però, implica che non posso assegnare ad una variabile direttamente la sub
B4X:
Private Sub Interest ' dà errore
    Private interest as Double
    interest = CalcInterestWithSpread(1000.88, 0.4)
    Log(interest)
End Sub

ma devo utilizzare un Wait for anche in questa sub:
B4X:
Private Sub Interest
    Private interest as Double
    Wait For (CalcInterestWithSpread(1000.88, 0.4)) Complete (Result as Double)
    interest = Result
    Log(interest) ' Potrei inserire direttamente Result ma nella maggior parte dei casi ci sono altre operazioni
End Sub

Questo è quello che ho capito.

C'è qualcosa che mi sfugge?*

Grazie!

* Se mi sta sfuggendo qualcosa, dei dettagli su cosa mi sfugge sarebbero graditi. :)
 
Last edited:

giannimaione

Well-Known Member
Licensed User
Longtime User
Una sub che contiene un waiting diventa una resumable
 
Upvote 1

Star-Dust

Expert
Licensed User
Longtime User
B4X:
Sub CalcInterestWithSpread(Capital As Double, Rate As Double) As resumableSub
 
Upvote 0

Sagenut

Expert
Licensed User
Longtime User
Come ti ha già indicato @Star-Dust :
In una Sub classica devi dichiarare esplicitamente il tipo di dato che vuoi Ritornare.
In una Resumable devi invece dichiararlo come ResumableSub e poi puoi Ritornare qualunque tipo vuoi.
 
Upvote 0

Elric

Well-Known Member
Licensed User
Grazie.

Volevo capire se mi ero perso qualcosa ma pare di no.

Posto che trovo più semplice e veloce
B4X:
interest = CalcInterestWithSpread(1000.88, 0.4)
anziché
B4X:
Wait For (CalcInterestWithSpread(1000.88, 0.4)) Complete (Result as Double)
    interest = Result
etc., assimilerò il principio secondo il quale
Una sub che contiene un waiting diventa una resumable
:)
 
Upvote 0

Star-Dust

Expert
Licensed User
Longtime User
il problema è un altro. Se metti un wait For (o uno sleep **i quali non sono lingerie**) la sub sale un livello superiore.
Se la sub doveva restituire una risposta, non può farlo perché ancora non ha l'esito della Resumable SUB. (ecco l'errore)

Quindi per funzionare hai due alternative.
  1. Anch'essa sia una resumable SUB (come proposto da @giannimaione e indicato me) e a sua volta va chimata con un WAIT FOR () COMPLETE().
  2. Oppure non restituendo nessun risultato può tranquillamente salire nel livello superiore e proseguire il filo di esecuzione del codice
    Verrà richiamato in quel punto dover è rimasto sospeso quando riceverà risultati e proseguirà il corso l'esecuzione della sub sospesa.
 
Last edited:
Upvote 1

Elric

Well-Known Member
Licensed User
B4X:
Wait For (CalcInterestWithSpread(1000.88, 0.4)) Complete (Result as Double)
    interest = Result
Puoi anche scrivere direttamente:
B4X:
Wait For (CalcInterestWithSpread(1000.88, 0.4)) Complete (interest as Double)

Si, infatti.
 
Upvote 0
Top