06/10/2023 - BennyBatt ha scritto:
Pertò, mi piacerebbe che tutto fosse risolto nella funzione (se possibile).
Non capisco cosa intendi. La tua funzione non può restituire la stringa bell'e pronta, perché è asincrona.
Tu stesso hai scritto:
async function fetchText(id)
Quell'async davanti ha un significato: sta a indicare che, qualunque sia il valore di ritorno di quella funzione, verrà restituito in modalità asincrona, ossia recupererà in background il risultato e te lo restituirà quando esso sarà disponibile, senza bloccare l'esecuzione.
Non esiste modo che tu possa creare una funzione che restituisca la stringa se, chiamando la funzione, questa darà luogo a operazioni in background che faranno avere una stringa solo al termine delle operazioni: ciò vuol dire lavorare in modo “bloccante”, ossia “sincrono”, perché per poter restituire una stringa dalla chiamata la funzione dovrà bloccare l'esecuzione fino a quando il dato non è disponibile, e ciò significa bloccare il programma.
In sintesi, la tua funzione chiama operazioni asincrone, e pertanto sarà di fatto asincrona.
Data questa premessa, hai due possibilità:
- se vuoi restituire un valore immediato nella funzione, questa non potrà essere altro che la Promise del risultato che arriverà al termine delle operazioni asincrone;
- se vuoi restituire direttamente la stringa, potrai farlo indicando però la funzione come async - così come hai fatto - ossia “la stringa la restituirò, ma tramite la Promise” quindi specificando il callback su then() (o usando await sulla chiamata alla funzione).
Quello che chiedi di fare è un controsenso: a meno di non voler costruire qualcosa di “bloccante” e quindi assolutamente non consigliabile, non puoi far sì che la tua funzione restituisca precisamente una stringa, e subito, quando quella informazione proviene da operazioni asincrone che ti restituiranno quel dato solo dopo, più avanti (per definizione).
Il tuo codice è corretto. Per poterlo essere completamente anche dal punto di vista di uniformità dello stile di codifica, basta modificarlo così:
const data = await fetchText(id_rif);
CustomBox.outerText = data;
CustomBox.boxType = item.dataset.version;
CustomBox.idCaller = i;
if (item.hasAttribute('data-reference')) {
CustomBox.reference = item.dataset.reference;
}
// inizializza l'oggetto
CustomBox.init();
// ...
Pensaci su. :)