如何在Singleton中同步getUserMedia回调

时间:2014-04-12 11:39:36

标签: javascript html5 callback synchronization getusermedia

我使用Singleton来获取录音机,但getUserMedia是异步的,我必须等待回调结束才能返回录音机对象。混合同步和异步可能不是一个好选择,但我不知道如何做,因为我无法使getUserMedia同步。

我们的想法是调用SoundRecorder.getInstance(),它将要求用户允许麦克风访问所有麦克风并且能够在我需要的任何时间获取录像机实例。

问题出在第一个电话:
var recorder = SoundRecorder.getInstance();
记录器值是"未定义"然后它适用于其他电话。

这是我的代码如下。谢谢你的帮助。

var SoundRecorder =(function(){

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

})();

1 个答案:

答案 0 :(得分:1)

最后我放弃使用单身人士只使用回叫。我使用输入隐藏字段调用getUserMedia一次,用于处理不同的状态:如果用户允许麦克风访问,则“启用”;如果不支持网络音频则禁用“禁用”,访问时使用“访问”问用户。我认为不是那么优雅,但它有效。我希望有一天能帮助别人; - )