gpt4 book ai didi

javascript - 在 js 中使用 Proxy 使 Promise 看起来同步实际上是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-03 22:19:40 25 4
gpt4 key购买 nike

    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);

所以我有从互联网上的要点复制的代码,它似乎有效。我理解陷阱是如何工作的,但我不明白代理如何使 promise 的返回像同步值一样。我的同事担心这段代码存在竞争条件。有竞争条件吗?幕后到底发生了什么?我需要改进此代码以使其安全吗?

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

最佳答案

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

例如,给定以下 API:

interface Bird {
speak(): void;
}
function getBird(): Promise<Bird> {
return new Promise((resolve) => {
setTimeout(() => resolve({ speak() { console.log('CAW'); } }, 1000);
});
}

function proxyPromise<T>(promise: Promise<T>) {
// Your promise proxying code here
}

proxyPromise 代码将允许您调用被代理对象上的方法,并将它们推迟到 Promise 得到解决:

const proxiedBird = proxyPromise(getBird());
console.log("Fetching Bird")
proxiedBird.speak;
console.log("Told it to speak");

此代码可以正常执行,但不会使 speak() 操作同步运行 - 它仍会等待 getBird() promise 解决。所以在输出中你会看到:

Fetching Bird
Told it to Speak
CAW

您拥有的代码片段不会执行任何操作来支持代理对象上带有参数的字段或方法。

您可以使用一些 typescript 输入来描述其安全行为:

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);
}

关于javascript - 在 js 中使用 Proxy 使 Promise 看起来同步实际上是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59686860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com