有没有办法在rxjs中处理canvas.toBlob和Observable?

有没有办法在rxjs中处理canvas.toBlob和Observable?,canvas,rxjs,Canvas,Rxjs,我一直在尝试用rxjs中的可观察对象来处理canvas.toBlob,而不是承诺或回调bindCallback操作符似乎很合适,所以我尝试了以下方法: bindCallback(canvas.toBlob)().pipe( map((blob: Blob) => URL.createObjectURL(blob)) ); 但是它给了我错误类型ERROR:invalize调用错误 如果接线员不适合,还有其他的想法吗? 感谢你的洞察力。谢谢。问题在于函数canvas.toBlob会丢失调

我一直在尝试用rxjs中的可观察对象来处理
canvas.toBlob
,而不是承诺或回调
bindCallback
操作符似乎很合适,所以我尝试了以下方法:

bindCallback(canvas.toBlob)().pipe(
  map((blob: Blob) => URL.createObjectURL(blob))
);
但是它给了我
错误类型ERROR:invalize调用
错误

如果接线员不适合,还有其他的想法吗?
感谢你的洞察力。谢谢。

问题在于函数
canvas.toBlob
会丢失调用上下文

如果您尝试以下方法,您也会遇到同样的问题:

const toBlob = canvas.toBlob;

toBlob(blob => console.log('hello'));
// ERROR TypeError: Illegal invocation
此函数,
toBlob
在内部使用
this
,但由于您不是从对象调用它,因此未定义此

解决方案是将其绑定到原始画布:

bindCallback(canvas.toBlob.bind(canvas))().pipe(
  map((blob: Blob) => URL.createObjectURL(blob))
);

它告诉我类型为“OperatorFunction”的参数不能赋值给类型为“OperatorFunction”的参数。类型“Blob”缺少类型“any[]”中的以下属性:长度、弹出、推送、concat和其他属性。
编译错误。您可能将
.bind
放在了错误的位置?请注意,它是
canvas.toBlob.bind(canvas)
,而不是
canvas.toBlob.bind(canvas)
我的错,不是这样。它可能是
映射的类型((blob:blob
)-尝试将其更改为any,看看您在运行时接收到的类型是什么……它似乎需要any[]?如果我将类型更改为any,编译错误就消失了,但我不明白它为什么需要any[]在编译错误处。是的,这很奇怪。理论上你不需要在映射中指定类型,typescript应该自己解决它。我刚刚在我的环境中进行了测试,TS@4.2.3 rxjs@6.6.6它工作正常,映射内部的类型被推断为(blob:blob | null)=>。。。