2015-10-22 6 views
0

Я пытаюсь присвоить значение переменной в функции обратного вызова. Насколько я знаю, функции обратного вызова являются асинхронными, поэтому я пытался использовать scope.apply, но он, похоже, не работает. Любые идеи?функция обратного вызова в AngularJS

angular.module("sadf") 

    .factory("browsersCameraSupportService", function ($scope, $apply) { 

     return { 

      supportsGetUserMedia: function() { 

       navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; 
       var hasCam = true; 
       if (navigator.getUserMedia) { 
        navigator.getUserMedia({video: true}, function(localMediaStream){ 

        }, function(){ 

         $scope.$apply(function(){ 
          hasCam = false; 
         }); 
        }); 
       } 
       return angular.isDefined(navigator.getUserMedia)&& hasCam; 
      } 
     }; 
    }); 
+0

$ scope.apply не меняет того факта, что 'возвращение angular.isDefined (navigator.getUserMedia) && hasCam; 'произошло long bfore hasCam было установлено в false. –

+0

Что вы пытаетесь достичь с большей точки зрения? Вы действительно не объяснили, что происходит. Угловое использует много обещаний, которые обрабатывают асинхронные обратные вызовы. – ryanyuyu

+0

@Kevin B да, я понял, что, когда он не работал. –

ответ

1

Это тот случай, когда использование $ apply - это не то, что вам нужно. Поскольку проверка на наличие носителей - асинхронная операция, удобно возвращать объект обещания и работать с ним во потребляющем коде. Тогда ваша служба будет:

angular.module("sadf") 

.factory("browsersCameraSupportService", function($q) { 

    return { 

     supportsGetUserMedia: function() { 

      navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; 

      return $q(function(resolve, reject) { 
       if (navigator.getUserMedia) { 
        navigator.getUserMedia({video: true}, function(localMediaStream) { 
         return resolve(true); 
        }, function() { 
         return resolve(false); 
        }); 
       } 
      }); 
     } 
    }; 
}); 

и использование прост:

browsersCameraSupportService.supportsGetUserMedia().then(function(supported) { 
    if (!supported) { 
     alert('Video is not supported.'); 
    } 
}); 

Демо:http://plnkr.co/edit/BTj6deHrIvKa2VK3Kn1M?p=preview