我试图了解用户是否在他的计算机上安装了网络摄像头,如果他有,则更改视图。它是如何工作的,等待来自最初在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;
});
答案 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);
}