等待代理导致获取“then”属性,我应该返回什么?

use*_*769 5 javascript async-await es6-proxy

我有一个Proxy模仿虚拟物体的方法。该代理的 Getter 返回准备好的值。

我发现,如果等待代理,它会导致调用我的代理的“then”属性:

await myProxy
Run Code Online (Sandbox Code Playgroud)

在这种情况下我的代理 getter 应该返回什么?返回代理本身或对自身的承诺是一个好主意吗?

例子在这里:

https://jsfiddle.net/rv55Lpu1

让我感到困惑的是,如果我是await一个对象,我会得到该对象,但如果我是awaita Proxy,它需要有一个返回自身的“then”属性陷阱。

Joe*_*Joe 2

您可能会考虑返回undefined一个没有方法的对象then,因为await会递归then调用,直到解析的对象不再有then方法为止。

举个例子:

(async () => {
    let p = new Proxy({ then: undefined }, {
        get: (target: any, prop: string, self: any) => {
            return (prop in target) ? target[prop] : (...args: any[]) => self;
        },
    });

    let example = await p.myChainable().awaitable().method();

    console.log("Result: ", example);
})();
Run Code Online (Sandbox Code Playgroud)

它只是返回"Result: { then: undefined },因为我们返回的self内容(...args: any[]) => self当然会被替换为您自己的逻辑。

{ then: undefined }如果你用其他类似的东西替换目标,{ test: "abc" }则根本不会有任何结果,因为承诺永远不会实现,并且 console.log 永远不会被调用。

所以作为结论,不 - 我不建议在then方法中返回代理对象本身。