Javascript 如何在单例中同步getUserMedia回调

Javascript 如何在单例中同步getUserMedia回调,javascript,html,callback,synchronization,getusermedia,Javascript,Html,Callback,Synchronization,Getusermedia,我使用单例获取音频记录器,但getUserMedia是异步的,我必须等待回调结束返回记录器对象。混合使用同步和异步可能不是一个好选择,但我不知道该怎么做,因为我无法使getUserMedia同步 我们的想法是调用SoundRecorder.getInstance(),它将要求用户允许麦克风访问一个,并在需要时随时获取记录器实例 第一次呼叫时出现问题: var recorder=SoundRecorder.getInstance() recorder值为“undefined”,则对其他调用正常工作

我使用单例获取音频记录器,但getUserMedia是异步的,我必须等待回调结束返回记录器对象。混合使用同步和异步可能不是一个好选择,但我不知道该怎么做,因为我无法使getUserMedia同步

我们的想法是调用SoundRecorder.getInstance(),它将要求用户允许麦克风访问一个,并在需要时随时获取记录器实例

第一次呼叫时出现问题:
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);
    }
}