Javascript 如何在单例中同步getUserMedia回调
我使用单例获取音频记录器,但getUserMedia是异步的,我必须等待回调结束返回记录器对象。混合使用同步和异步可能不是一个好选择,但我不知道该怎么做,因为我无法使getUserMedia同步 我们的想法是调用SoundRecorder.getInstance(),它将要求用户允许麦克风访问一个,并在需要时随时获取记录器实例 第一次呼叫时出现问题:Javascript 如何在单例中同步getUserMedia回调,javascript,html,callback,synchronization,getusermedia,Javascript,Html,Callback,Synchronization,Getusermedia,我使用单例获取音频记录器,但getUserMedia是异步的,我必须等待回调结束返回记录器对象。混合使用同步和异步可能不是一个好选择,但我不知道该怎么做,因为我无法使getUserMedia同步 我们的想法是调用SoundRecorder.getInstance(),它将要求用户允许麦克风访问一个,并在需要时随时获取记录器实例 第一次呼叫时出现问题: var recorder=SoundRecorder.getInstance() recorder值为“undefined”,则对其他调用正常工作
var recorder=SoundRecorder.getInstance()
recorder值为“undefined”,则对其他调用正常工作 下面是我的代码。谢谢你的帮助 var SoundRecorder=(函数(){
})() 最后我放弃了使用singleton,只使用回调。我用一个隐藏的输入字段来处理不同的状态:如果用户允许麦克风访问,则“启用”;如果不支持web音频,则“禁用”;如果请求用户访问,则“访问”。我觉得不那么优雅,但它很管用。我希望有一天这能帮助别人;-) samidarko-你愿意分享你的解决方案的代码吗,因为我认为这正是我想要的!同时,我会尽力重现你所说的。
var instance = null;
function init () {
var dfd = $.Deferred();
if (instance == null) {
navigator.getUserMedia({audio: true},
function(stream) {
var audioContext = new AudioContext();
var input = audioContext.createMediaStreamSource(stream);
console.log('Media stream created.');
input.connect(audioContext.destination);
console.log('Input connected to audio context destination.');
instance = new Recorder(input);
dfd.resolve('recorder created');
},
function (e) {
dfd.reject('No live audio input');
notify('error', 'No live audio input: ' + e);
});
} else {
dfd.resolve('recorder already created');
}
return dfd.promise();
}
function waitFor(p){
if (p.state() == "resolved" || p.state() == "rejected") {
return instance;
} else {
setTimeout(waitFor, 500, p);
}
}
return {
getInstance: function() {
var promise = init();
promise.then(function () {
console.log('init success');
}, function () {
console.log('init failed');
});
return waitFor(promise);
}
}