Hufe921 / canvas-editor

rich text editor by canvas/svg
https://hufe.club/canvas-editor-docs
MIT License
3.43k stars 498 forks source link

关于自定义 paste 并可选的保持 paste 默认行为的后续优化 #672

Closed junestars closed 2 months ago

junestars commented 2 months ago

version

0.9.84

Link to minimal reproduction

https://hufe.club/canvas-editor/

Steps to reproduce

首先非常感谢您更新了自定义 paste 并可选的保持 paste 默认行为的功能,非常感谢!

目前这个功能存在以下问题,使其不能充分发挥其作用 1、源码中的 isPromiseFunction 方法无法正确的判断 override.paste 是否是返回 Promise 的函数

// 在 Vue 的单文件组件

const instance = new Editor(container, data, options);

instance.override.paste = async () => ({ preventDefault: false });

// 这里会打印 Function 而非 AsyncFunction
console.log(instance.override.paste.constructor.name); // Function
// 在浏览器控制台

const func = async () => ({ preventDefault: false });

func .constructor.name // 会打印出 AsyncFunction

2、如果在 override.paste 中读取了剪切板,override.paste 为异步方法,且没有被立刻解决,则默认行为中的 clipboardData.getData('text') 会返回 '',导致默认行为无法正常执行。是否可以在调用 override.paste 之前将剪切板的内容存在变量中,以备后续使用。下面是复现的代码

instance.override.paste = async event => {
    const clipboardText = event.clipboardData.getData('text');

    console.log({ clipboardText }); // 剪切板的文本

    function doSomething() {
        const { promise, resolve } = Promise.withResolvers();
        setTimeout(() => {
            resolve();
        }, 0);
        return promise;
    }

    // 如果注释 doSomething 的调用,默认行为正常
    // 如果调用,则默认行为中的 clipboardData.getData('text') 会返回空字符串
    await doSomething();

    return { preventDefault: false };
};

What is expected?

1、可以正常判断返回 Promise 的函数 2、在粘贴的整个过程中,可以持续访问剪切板的内容,包括文本、html 和 文件

What is actually happening?

如上

System Info

No response

Any additional comments?

No response

Hufe921 commented 2 months ago

移除保持默认行为参数时异步支持,使用异步函数需全部重写。原因:

  1. 在不执行函数时,无法准确确定一个函数是否是promise
  2. 对内部的后续行为有影响