Javascript webglcontextcreationerror事件:是否同步触发?

Javascript webglcontextcreationerror事件:是否同步触发?,javascript,html,canvas,webgl,Javascript,Html,Canvas,Webgl,是同步触发还是异步触发?例如 canvas.addEventListener("webglcontextcreationerror", function() { console.log("Error"); }); var context = canvas.getContext("webgl"); console.log("After creation"); 在输出错误的情况下 "After creation" "Error" 或 ? 我不确定如何强迫这个事件自己找出答案。NB:这不是一个

是同步触发还是异步触发?例如

canvas.addEventListener("webglcontextcreationerror", function() {
  console.log("Error");
});
var context = canvas.getContext("webgl");
console.log("After creation");
在输出错误的情况下

"After creation"
"Error"

?


我不确定如何强迫这个事件自己找出答案。

NB:这不是一个符合规格的答案,而是来自一个UA测试,因此它可能是错误的,或者至少只适用于这个UA,也称为Chrome


在chrome中,要强制执行错误事件,可以先请求2dContext,然后再请求webgl

通过这种方式,我们可以看到此UA确实将事件视为同步事件。
我现在才知道这些

var canvas=document.createElement('canvas')
addEventListener(“webglcontextcreationerror”,函数(){
log(“错误”);
});
canvas.getContext('2d')
canvas.getContext(“webgl”);
log(“创建后”)

所以有一个问题是,你为什么关心订单
getContext
在失败时返回
null
,因此如果您想知道它是否失败,那么就完成了
webglcontextcreationerror
的唯一一点是,您需要知道它失败的原因,因为
getContext
无法做到这一点。因此,您可以对代码进行结构化,使其无论是同步还是异步

var canvas=document.createElement('canvas')
函数doSomethingWithStatusMessage(e){
日志(“上下文创建错误:+e.statusMessage”);
}
canvas.addEventListener(“webglcontextcreationerror”,doSomethingWithStatusMessage);
日志(“2d:+canvas.getContext('2d'));
日志(“webgl:+canvas.getContext”(“webgl”);
日志(“创建后”);
函数日志(消息,颜色){
var div=document.createElement(“pre”);
div.appendChild(document.createTextNode(msg));
文件.正文.附件(div);

}
根据定义,事件不总是异步的吗?有趣的是,当您首先请求2D上下文,然后请求webgl上下文时,即使“用户代理无法创建WebGLRenderingContext上下文”,事件也不会触发(至少在FF上),所以我只是在chrome上尝试,它会同步触发事件。。。但是webkit在同步调用流结束之前触发了事件,因此我不知道这是否是一个真实可靠的答案。“事件不总是异步的吗?”我不这么认为。。。它的触发(/调度)可由程序员自行决定。例如,同步触发一个自定义事件。好吧,那么你是对的,答案是肯定的。它是同步的,你可以用
var canvas=document.createElement('canvas')canvas.addEventListener(“webglcontextcreationerror”,function(){console.log(“Error”);}测试它;canvas.getContext(“2d”)canvas.getContext(“webgl”);console.log(“创建后”)在chrome中。@kaido啊,太棒了!尝试在webgl上下文之后创建2d上下文是强制执行错误的一种方法。请随意添加您的评论作为答案。返回空值的好处在于此。我可能会在我的代码中这样做。
"Error"
"After creation"