PDA

Visualizza la versione completa : ritornare valori da callback


magic_key
22-04-2021, 09:36
Ciao, ai fini di un applicativo che sfrutta la fotocamera come barcode/QR scanner, ho la seguente funzione che mi permette di capire se l'utente ha la cam accesa o spenta, ma non riesco a ritornare i valori sotto forma di response (ho bisogno del return di hasWebcam e isWebcamAlreadyCaptured).

Come fare?


checkCamAvaiable(){

if(navigator.mediaDevices && navigator.mediaDevices.enumerateDevices){
navigator.enumerateDevices = function(callback) {
navigator.mediaDevices.enumerateDevices().then(cal lback);
};
}


var MediaDevices = [];
var isHTTPs = location.protocol === 'https:';
var canEnumerate = false;


if (typeof MediaStreamTrack !== 'undefined' && 'getSources' in MediaStreamTrack) {
canEnumerate = true;
} else if (navigator.mediaDevices && !!navigator.mediaDevices.enumerateDevices) {
canEnumerate = true;
}


var hasWebcam = false;
var isWebcamAlreadyCaptured = false;




function checkDeviceSupport(callback) {


if (!canEnumerate) {
return;
}


if (!navigator.enumerateDevices && window.MediaStreamTrack && window.MediaStreamTrack.getSources) {
navigator.enumerateDevices = window.MediaStreamTrack.getSources.bind(window.Med iaStreamTrack);
}


if (!navigator.enumerateDevices && navigator.enumerateDevices) {
navigator.enumerateDevices = navigator.enumerateDevices.bind(navigator);
}


if (!navigator.enumerateDevices) {
if (callback) {
callback();
}
return;
}


MediaDevices = [];
navigator.enumerateDevices(function(devices) {


devices.forEach(function(_device) {
var device = {};
for (var d in _device) {
device[d] = _device[d];
}


if (device.kind === 'audio') {
device.kind = 'audioinput';
}


if (device.kind === 'video') {
device.kind = 'videoinput';
}


var skip;
MediaDevices.forEach(function(d) {
if (d.id === device.id && d.kind === device.kind) {
skip = true;
}
});


if (skip) {
return;
}


if (!device.deviceId) {
device.deviceId = device.id;
}


if (!device.id) {
device.id = device.deviceId;
}


if (!device.label) {
device.label = 'Please invoke getUserMedia once.';
if (!isHTTPs) {
device.label = 'HTTPs is required to get label of this ' + device.kind + ' device.';
}
} else {
if (device.kind === 'videoinput' && !isWebcamAlreadyCaptured) {
isWebcamAlreadyCaptured = true;
}
}


if (device.kind === 'videoinput') {
hasWebcam = true;
}


MediaDevices.push(device);
});


if (callback) {
callback();
}
});

}




checkDeviceSupport(function() {
console.log('hasWebCam: ', hasWebcam);
console.log('isWebcamAlreadyCaptured: ', isWebcamAlreadyCaptured);
});


}

alka
22-04-2021, 09:48
ai fini di un applicativo che sfrutta la fotocamera come barcode/QR scanner, ho la seguente funzione che mi permette di capire se l'utente ha la cam accesa o spenta, ma non riesco a ritornare i valori sotto forma di response (ho bisogno del return di hasWebcam e isWebcamAlreadyCaptured).

Come fare?


Puoi passare i valori che devi "ritornare" come parametri alla funzione di callback, in modo che possano essere letti dalla stessa e utilizzati.

Ad esempio, passando una funzione di callback fatta così:


checkDeviceSupport(function(hasWebcam, isWebcamAlreadyCaptured) {
console.log('hasWebCam: ', hasWebcam);
console.log('isWebcamAlreadyCaptured: ', isWebcamAlreadyCaptured);
});


e invocandola in questo modo:


if (callback) {
callback(hasWebcam, isWebcamAlreadyCaptured);
}


In poche parole, usi solo variabili locali, non restituisci alcun valore, ma gestisci sempre tramite "callback" il flusso di esecuzione del programma, passando i valori che ti servono come parametri alla funzione e gestendo nel callback il loro valore nel modo opportuno.

Ciao! :ciauz:

magic_key
22-04-2021, 14:21
Puoi passare i valori che devi "ritornare" come parametri alla funzione di callback, in modo che possano essere letti dalla stessa e utilizzati.

Ad esempio, passando una funzione di callback fatta così:


checkDeviceSupport(function(hasWebcam, isWebcamAlreadyCaptured) {
console.log('hasWebCam: ', hasWebcam);
console.log('isWebcamAlreadyCaptured: ', isWebcamAlreadyCaptured);
});


e invocandola in questo modo:


if (callback) {
callback(hasWebcam, isWebcamAlreadyCaptured);
}


In poche parole, usi solo variabili locali, non restituisci alcun valore, ma gestisci sempre tramite "callback" il flusso di esecuzione del programma, passando i valori che ti servono come parametri alla funzione e gestendo nel callback il loro valore nel modo opportuno.

Ciao! :ciauz:

Grazie per la risposta!
quindi non c'è modo di accedere alle variabili esternamente alla funzione?
Se volessi abilitare/disabilitare un pulsante devo farlo dal suo interno?

cavicchiandrea
22-04-2021, 14:48
Si che si può le rendi globali, spostandole fuori dalla funzione

magic_key
22-04-2021, 15:13
Si che si può le rendi globali, spostandole fuori dalla funzione

Grazie per la risposta.

Non sono pratico con le callback e con le variabili globali.. in sostanza il tutto dovrebbe funzionare in questo modo?


checkDeviceSupport(function(hasWebcam, isWebcamAlreadyCaptured) {
global.hasWebcam = hasWebcam;
global.isWebcamAlreadyCaptured = isWebcamAlreadyCaptured;
}


Poi esternamente:

checkCamAvaiable()

if(window.hasWebcam){
...
}

if(window.isWebcamAlreadyCaptured){
...
}

alka
22-04-2021, 18:58
quindi non c'è modo di accedere alle variabili esternamente alla funzione?


Quello che deve interessarti è ricevere i valori delle variabili, non necessariamente le variabili in quanto tale.

Anche se dichiari le variabili come globali, non otterrai l'effetto voluto se vai a leggerne il valore all'esterno della funzioni che chiami e che va ad assegnare loro il valore che ti interessa solo nel callback, ovvero quando l'azione è stata eseguita.

In pratica, la chiamata della funzione va ad avviare un processo che solo in un secondo momento restituirà controllo al tuo codice richiamando il callback che, a sua volta, va a impostare le variabili con il valore corretto: se dopo la chiamata alla funzione metti del codice, questo verrà eseguito subito, prima che l'operazione asincrona abbia termine e richiami il callback che valorizza le variabili.

Devi gestire tutto tramite callback.

Nello specifico, non so bene cosa dovrebbe fare questa logica applicativa, cioè non ho il tempo materiale di approfondire o testare il tutto, quindi non saprei proporti una soluzione "chiavi in mano" e pronta all'uso per il tuo problema.

Ciao! :ciauz:

Loading