AngularJS用$ q获得无限循环

时间:2015-10-28 11:38:37

标签: angularjs

我试图了解用户是否在他的计算机上安装了网络摄像头,如果他有,则更改视图。它是如何工作的,等待来自最初在api中的回调的响应,然后返回true或false。但它冻结了,当我做一个控制台日志时,我得到了无穷无尽的控制台日志..是什么导致这个?

服务

'use strict';
angular.module("browserSupportService")

        .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);
                            });
                        }
                    });
                }
            };
        });

控制器中的功能:

$scope.browserSupportsGetUserMedia = function () {

              browsersCameraSupportService.supportsGetUserMedia().then(function(supported) {
                console.log("no camera")
                if (!supported) {
                    return false;
                }
                return true;
            });

1 个答案:

答案 0 :(得分:0)

我认为您的承诺可能永远不会自行解决,因为根据MDN文档:

  

提示用户允许使用一个视频和/或一个音频输入设备,如相机或屏幕共享和/或麦克风。如果用户提供权限,则调用successCallback,并将生成的MediaStream对象作为其参数。如果用户拒绝权限或媒体不可用,则分别使用PermissionDeniedError或NotFoundError调用errorCallback。 请注意,无法调用完成回调,因为用户无需进行选择。

if(navigator.getUserMedia)还存在问题,而不是现在,您的承诺永远不会实现。

因此,我建议设置等待用户解析的超时限制,否则,将promise解析为false,如果已解决,则删除Timeout。当然,处理if问题。

类似的东西:

if (navigator.getUserMedia) {
    var timeBomb = setTimeout(function(){resolve(false);}, 5000);
    navigator.getUserMedia({video: true}, function(localMediaStream) {
        clearTimeout(timeBomb);
        return resolve(true);
    }, function() {
        clearTimeout(timeBomb);
        return resolve(false);
    });
}else{
    resolve(false);
}
相关问题