2

明らかにこのコードfor-loopはUI/ブラウザをブロックするので、非同期ループに変換する必要があるこのコードがあります:

    $wnd.mainbuff = [];
    $wnd.update = setInterval(function(){
            // fetches everything in the buffer (csv), including old data
            var temp = $wnd.Recorder.audioData().toString();
            var arr = temp.split(',');
            // so, copy new elements only (must be async) 
            for (var i=$wnd.mainbuff.length; i < arr.length; i++) {
                console.log(arr[i]);
                $wnd.mainbuff[i] = arr[i];  
            }
        }
    ,25)
4

2 に答える 2

2

ループを同等の再帰関数に変えます。そうすれば、setTimeout自分自身を呼び出すときに使いやすくなります。

$wnd.mainbuff = [];
$wmd.curTimerId = null;
$wnd.update = function() {
    var start = Date.now();
    // fetches everything in the buffer (csv), including old data
    //                             doesn't sound good ^^^^^^^^
    var temp = $wnd.Recorder.audioData().toString();
    var arr = temp.split(',');
    // so, copy new elements only
    function processOne(i, callback) {
        if (i < arr.length) {
            console.log(arr[i]);
            $wnd.mainbuff[i] = arr[i];
            setTimeout(function(){processOne(i+1, callback);}, 0);
        } else
            callback();
    }
    processOne($wnd.mainbuff.length, function() {
        setTimeout($wnd.update, 25- (Date.now()-start));
    });
}
于 2012-10-29T12:13:51.683 に答える
1

これを試して:

$wnd.mainbuff = [];
function async(arr, wnd, currentIndex) {
    console.log(arr[currentIndex]);
    wnd.mainbuff[currentIndexi] = arr[currentIndexi];
}
$wnd.update = setInterval(function(){
        // fetches everything in the buffer (csv), including old data
        var temp = $wnd.Recorder.audioData().toString();
        var arr = temp.split(',');
        // so, copy new elements only (must be async)
        for (var i=$wnd.mainbuff.length; i < arr.length; i++) {
            async(arr, $wnd, i);
        }
    }
,25)
于 2012-10-29T12:05:44.117 に答える