Nel caso si abbia la necessità nel richiamare una funzione asincrona senza usare la yield, perché voglio che il processo continui e non aspetti il risultato, devo utilizzare la call back.
Quindi se ho una funzione come la seguente definita a livello di applicazione:
App.Session.prototype.function1 = function(ms)
{
var retVal = null;
//
app.sleep(ms, function (result, error) {
if (result) {
console.log("PG - true");
retVal = true;
} else {
console.log("PG - false");
retVal = false;
}
});
//
return retVal;
};
In questa funzione ho tolto la yield al metodo app.sleep e aggiunto una call back per simulare una situazione reale che potrebbe capitare se occorre utilizzare un modulo Node.JS che non è già integrato su Instant Developer Cloud ed ha metodi asincroni che quindi prevedo l’utilizzo delle call back.
Questa funzione ritorna null e non è utilizzabile senza l’implementazione della call back nel nostro codice utilizzandola con:
let res = app.function1(2000);
Questa funzione quindi non risulta asincrona e l’ide non aggiunge e non permette di utilizzare la yield nel suo richiamo.
Come gestiamo questa casistica?
Possiamo utilizzare una proprietà di applicazione da impostare nella nostra funzione e aggiungere l’evento onChange alla proprietà che poi andrà a fare cose sulla nostra applicazione.
Quindi il codice potrebbe diventare:
App.Session.prototype.function1 = function(ms)
{
var retVal = null;
app.retValFunction1 = null;
//
app.sleep(ms, function (result, error) {
if (result) {
retVal = true;
} else {
retVal = false;
}
app.retValFunction1 = retVal;
return;
});
};
Questa versione la usiamo così:
app.function1(2000);
Poi avremo l’evento onChange della proprietà app.retValFunction1:
App.Session.prototype.retValFunction1_onChange = function(newValue)
{
console.log("PG - newValue retVal ", newValue);
//
if (newValue !== null)
App.PageController.postMessage(app, {retVal : newValue});
};
Il metodo postMessage della videata PageController (quella che eredita da Ionic.MainPage) manda un messaggio alla videata in primo piano e questa nell’evento onMessage può gestire il valore inviato.