Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    ritornare valori da callback

    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?

    codice:
    checkCamAvaiable(){
    
            if(navigator.mediaDevices && navigator.mediaDevices.enumerateDevices){
                navigator.enumerateDevices = function(callback) {
                    navigator.mediaDevices.enumerateDevices().then(callback);
                };
            }
    
    
            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.MediaStreamTrack);
                }
    
    
                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);
            });
    
    
        }

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,917
    Quote Originariamente inviata da magic_key Visualizza il messaggio
    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ì:
    codice:
            checkDeviceSupport(function(hasWebcam, isWebcamAlreadyCaptured) {
                console.log('hasWebCam: ', hasWebcam);
                console.log('isWebcamAlreadyCaptured: ', isWebcamAlreadyCaptured);
            });
    e invocandola in questo modo:
    codice:
     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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Quote Originariamente inviata da alka Visualizza il messaggio
    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ì:
    codice:
            checkDeviceSupport(function(hasWebcam, isWebcamAlreadyCaptured) {
                console.log('hasWebCam: ', hasWebcam);
                console.log('isWebcamAlreadyCaptured: ', isWebcamAlreadyCaptured);
            });
    e invocandola in questo modo:
    codice:
     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!
    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?

  4. #4
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,105
    Si che si può le rendi globali, spostandole fuori dalla funzione
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  5. #5
    Quote Originariamente inviata da cavicchiandrea Visualizza il messaggio
    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?

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

    Poi esternamente:
    codice:
    checkCamAvaiable()
    
    if(window.hasWebcam){
        ...
    }
    
    if(window.isWebcamAlreadyCaptured){
        ...
    }

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,917
    Quote Originariamente inviata da magic_key Visualizza il messaggio
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2021 vBulletin Solutions, Inc. All rights reserved.