Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.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 访问canvas.ToBlob()异步函数外部的blob值_Javascript_Html_Promise - Fatal编程技术网

Javascript 访问canvas.ToBlob()异步函数外部的blob值

Javascript 访问canvas.ToBlob()异步函数外部的blob值,javascript,html,promise,Javascript,Html,Promise,我正在使用HTMLCanvas元素,该元素在async toBlob()函数的外部返回blob对象。这个函数不返回输出值,所以我尝试在外部声明一个变量,并通过命令访问它 我如何将JS Promise用于此场景? var-myblob; canvas.toBlob(函数(blob){ myblob=blob; log(“内部”+myblob);//在控制台外部之后获取值 }) console.log(“外部”+myblob);//获取未定义的您可以使用Promise构造函数,将Blob实例传递到

我正在使用
HTMLCanvas
元素,该元素在
async toBlob()函数的外部返回blob对象。这个函数不返回输出值,所以我尝试在外部声明一个变量,并通过命令访问它

我如何将
JS Promise
用于此场景?

var-myblob;
canvas.toBlob(函数(blob){
myblob=blob;
log(“内部”+myblob);//在控制台外部之后获取值
})

console.log(“外部”+myblob);//获取未定义的
您可以使用
Promise
构造函数,将
Blob
实例传递到
resolve()
,在
处访问
Promise
值。然后()

constblob=wait new Promise(resolve=>canvasElem.toBlob(resolve));

我有另一个想法。。。与标记为最佳想法的类似。。。then的问题是,为了从承诺中获得结果,您必须在块内。现在Javascript支持wait类似于c#,这是很好的,因为您可以运行函数并等待,直到解析,然后将结果发送到未附加到任何函数的变量,例如:

/*基本上,我们创建一个函数,该函数接收一个名为mycanvas的画布,然后我们告诉该函数返回一个新的承诺,该承诺在.toBlob方法中“解析”,该方法默认提供一个Blob参数*/
函数getCanvasBlob(mycanvas){
返回新承诺(功能(解决、拒绝){
mycanvas.toBlob((blob)=>{
解析(blob)
})
})
}
var-myblob;
试一试{
myblob=等待getCanvasBlob(来自某处的画布);
}
捕获(错误){
console.log(错误);
}
/*没有必要使用try/catch,您可以像这样使用它*/

var myblob=wait getCanvasBlob(CANVAS\u来自某处)
.toBlob()
回调中执行任务,或使用
承诺
构造函数或可能重复的感谢,并感谢您的及时回复。我的问题是,我必须在一个全局变量中设置blob的值,这样我就可以在这个函数之外访问它。例如:在canvasBlob内部。然后(function(blob)){this.something=blob;}在
.toBlob()回调返回值之前,您将无法访问
blob
。使用传递到
.then()
的第一个函数执行来自
.toBlob()的
Blob
回调的任务。谢谢。在我的场景中,我有一个视频元素和画布,用于从视频中捕获快照并在图像控件中进行渲染。当前,代码在捕获鼠标单击事件中执行。现在,一旦我有了图片,我必须让用户点击一个按钮,通过ajax请求将图片发送到服务器。当前,toBlob()正在捕获事件中执行,我想看看是否有办法存储该blob,以便我可以在按钮单击事件中访问它,将其提交给服务器。任何建议都会很有帮助!我认为在按钮单击中第二次调用.toblob()会返回相同的图像。非常感谢。你的第一次尝试就要成功了。调用
.toBlob()
时,在
.toBlob()
回调中分配
myblob
Blob
值。看也精彩!谢谢。布莱利安的确:)太棒了!你能解释一下吗?
function getCanvasBlob(canvas) {
  return new Promise(function(resolve, reject) {
    canvas.toBlob(function(blob) {
      resolve(blob)
    })
  })
}

var canvasBlob = getCanvasBlob(canvas);

canvasBlob.then(function(blob) {
  // do stuff with blob
}, function(err) {
  console.log(err)
});