Javascript 在js中使用代理使承诺看起来是同步的,实际上是如何工作的? const处理程序:ProxyHandler={ get:(目标:承诺,道具:字符串,接收者:任意)=>{ 返回目标。然后((o)=>{ 返回o[prop]。应用(o); }); }, }; 返回新代理(obj,handler);

Javascript 在js中使用代理使承诺看起来是同步的,实际上是如何工作的? const处理程序:ProxyHandler={ get:(目标:承诺,道具:字符串,接收者:任意)=>{ 返回目标。然后((o)=>{ 返回o[prop]。应用(o); }); }, }; 返回新代理(obj,handler);,javascript,node.js,typescript,Javascript,Node.js,Typescript,所以我从互联网上的一个要点中复制了这个代码,它似乎起作用了。我理解陷阱是如何工作的,但我不明白代理如何使承诺的返回像同步值一样。我的同事担心这个代码有种族条件。有比赛条件吗?引擎盖下到底发生了什么?我是否需要改进此代码以使其安全 代码是用typescript编写的,在nodejs 10上运行。棘手的问题@Xenotheracide。但是回答你,实际上,这根本不是同步工作的,基本上,你将每个obj属性都设置为只能异步访问,如果属性不是函数,它会抛出一个错误 在引擎盖下,您只捕获一个promiseg

所以我从互联网上的一个要点中复制了这个代码,它似乎起作用了。我理解陷阱是如何工作的,但我不明白代理如何使承诺的返回像同步值一样。我的同事担心这个代码有种族条件。有比赛条件吗?引擎盖下到底发生了什么?我是否需要改进此代码以使其安全


代码是用typescript编写的,在nodejs 10上运行。

棘手的问题@Xenotheracide。但是回答你,实际上,这根本不是同步工作的,基本上,你将每个
obj
属性都设置为只能异步访问,如果属性不是函数,它会抛出一个错误

在引擎盖下,您只捕获一个promise
get
properties,并在陷阱中等待promise解析并执行promise解析的该值中的属性(函数)

我在操场上模拟它:

const处理程序:ProxyHandler={
get:(目标:承诺,道具:字符串,接收者:任意)=>{
返回目标。然后((o)=>{
返回o[prop]。应用(o);
});
},
};
常量对象={
(){
回复“你好”
},
b:5
}
constproxy=新代理(Promise.resolve(obj),handler);
//两张照片都是承诺
console.log(proxy.a)//解析后,返回'Hi'
console.log(proxy.b)//错误

如果您不想解决承诺本身,这种代理方法可能很有用。但是您需要等待每个属性,而不是函数属性。

看起来这段代码根本不会使访问同步。看起来它可以使承诺有效负载上的任何方法在承诺上可用,但在调用时它们仍然具有延迟执行

例如,给定以下API:

    const handler: ProxyHandler<any> = {
      get: (target: Promise<any>, prop: string, receiver: any) => {
        return target.then((o) => {
          return o[prop].apply(o);
        });
      },
    };
    return new Proxy(obj, handler);
此代码可以正常执行,但不会使
speak()
操作同步运行——它仍将等待
getBird()
承诺得到解决。因此,在输出中,您将看到:

const proxiedBird = proxyPromise(getBird());
console.log("Fetching Bird")
proxiedBird.speak;
console.log("Told it to speak");
您拥有的代码片段不支持代理对象上带有参数的字段或方法

您可以通过键入一些typescript来描述其安全行为:

Fetching Bird
Told it to Speak
CAW
type MethodProxy={
[idx in keyof T]:T[idx]扩展()=>推断U?承诺:永不;
}
函数proxyPromise(promise:promise):MethodProxy{
常量处理程序:ProxyHandler={
get:(目标:承诺,道具:字符串,接收者:任意)=>{
返回目标。然后((o)=>{
返回o[prop]。应用(o);
});
},
};
返回新代理(承诺、经办人);
}

但是,代理拒绝等待与返回承诺本身相比如何?看起来它是在回报承诺。这是否有文档记录?我还注意到您有
新的代理(Promise.resolve(obj),handler)
解析是否需要安全?或者等待?代理没有等待,其所有
get
陷阱将返回一个
Promise
。你得等着拿到那笔财产。第二个注释是
Promise.resolve()
,它只是一种返回总是直接解析的
Promise
的方法。在本例中,我这样做只是为了避免调用构造函数,但代理如何拒绝等待,而不是返回承诺本身?看起来它是在回报承诺。这在什么地方被记录了吗?
target.then()
行是按照承诺操作的,这就是它“知道等待”的方式。
Fetching Bird
Told it to Speak
CAW
type MethodProxy<T> = {
  [idx in keyof T]: T[idx] extends () => infer U ? Promise<U> : never;
}

function proxyPromise<T>(promise: Promise<T>): MethodProxy<T> {
  const handler: ProxyHandler<any> = {
    get: (target: Promise<any>, prop: string, receiver: any) => {
      return target.then((o) => {
        return o[prop].apply(o);
      });
    },
  };
  return new Proxy(promise, handler);
}