Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Safari—;在前几次之后无法创建振荡器_Javascript_Safari_Es6 Promise_Web Audio Api - Fatal编程技术网

Javascript Safari—;在前几次之后无法创建振荡器

Javascript Safari—;在前几次之后无法创建振荡器,javascript,safari,es6-promise,web-audio-api,Javascript,Safari,Es6 Promise,Web Audio Api,我正在尝试使用WebAudioAPI,但在使用Safari时遇到了一个问题。我的实验在Firefox和Chrome上运行正常 我编写了一个Promisified函数来播放单个音符,然后尝试使用该函数播放一系列音符 仅在Safari上,它在前四个注释后失败,并显示以下消息: 未处理的承诺拒绝:TypeError:null不是对象(正在计算“context.create振荡器”) 好的,我还没有处理这个错误,但是为什么我会得到它?它建议限制四个振荡器 功能音(频率、持续时间){ 返回新承诺(功能(

我正在尝试使用WebAudioAPI,但在使用Safari时遇到了一个问题。我的实验在Firefox和Chrome上运行正常

我编写了一个Promisified函数来播放单个音符,然后尝试使用该函数播放一系列音符

仅在Safari上,它在前四个注释后失败,并显示以下消息:

未处理的承诺拒绝:TypeError:null不是对象(正在计算“context.create振荡器”)

好的,我还没有处理这个错误,但是为什么我会得到它?它建议限制四个振荡器

功能音(频率、持续时间){
返回新承诺(功能(解决、拒绝){
var audioContext=window.audioContext | | window.webkitadiocontext;
var-context=新的音频上下文;
var振荡器=context.create振荡器();
振荡器.frequency.value=频率;
振荡器。连接(上下文。目的地);
振荡器。类型=‘锯齿’;
振荡器.start(context.currentTime);
振荡器。停止(上下文。当前时间+持续时间);
振荡器。onended=解析;
});
}
document.querySelector('button#play test')。onclick=函数(事件){
音调(130.81,1)
.然后(()=>音调(146.83,1))
.然后(()=>音调(164.81,1))
.然后(()=>音调(174.61,1))
.然后(()=>音调(196.00,1))
;
};

播放
限制是您可以同时运行的音频上下文的数量

有些浏览器有这样的限制,因为AudioContext需要来自硬件(声卡)的资源,并且该硬件有限制

因此,重构代码,使其不会每次都创建新的AudioContext:

//创建单个音频上下文
var context=new(window.AudioContext | | window.webkitadiocontext)();
功能音(频率、持续时间){
返回新承诺(功能(解决、拒绝){
var振荡器=context.create振荡器();
振荡器.frequency.value=频率;
振荡器。连接(上下文。目的地);
振荡器类型='锯齿';
振荡器.start(context.currentTime);
振荡器停止(context.currentTime+持续时间);
振荡器。onended=解析;
});
}
document.querySelector('button#play test')。onclick=函数(事件){
音调(130.81,1)
.然后(()=>音调(146.83,1))
.然后(()=>音调(164.81,1))
.然后(()=>音调(174.61,1))
.然后(()=>音调(196.00,1))
.catch(控制台错误);
};

播放
限制是您可以同时运行的音频上下文的数量

有些浏览器有这样的限制,因为AudioContext需要来自硬件(声卡)的资源,并且该硬件有限制

因此,重构代码,使其不会每次都创建新的AudioContext:

//创建单个音频上下文
var context=new(window.AudioContext | | window.webkitadiocontext)();
功能音(频率、持续时间){
返回新承诺(功能(解决、拒绝){
var振荡器=context.create振荡器();
振荡器.frequency.value=频率;
振荡器。连接(上下文。目的地);
振荡器类型='锯齿';
振荡器.start(context.currentTime);
振荡器停止(context.currentTime+持续时间);
振荡器。onended=解析;
});
}
document.querySelector('button#play test')。onclick=函数(事件){
音调(130.81,1)
.然后(()=>音调(146.83,1))
.然后(()=>音调(164.81,1))
.然后(()=>音调(174.61,1))
.然后(()=>音调(196.00,1))
.catch(控制台错误);
};

播放
谢谢。它工作得很好。我认为上下文是自动处理的。
振荡器
对象会发生什么情况?它确实应该在振荡器结束后在代码中被处理掉,但这可能只发生在垃圾收集器启动时,在正常情况下不应该经常发生。你的振荡器没有重量,也只是在它的合一事件后死亡。对于AudioContext:对于AudioNode:谢谢。它工作得很好。我认为上下文是自动处理的。
振荡器
对象会发生什么情况?它确实应该在振荡器结束后在代码中被处理掉,但这可能只发生在垃圾收集器启动时,在正常情况下不应该经常发生。你的振荡器没有重量,也只是在它的合一事件后死亡。对于AudioContext:和AudioNode: