否,那是不可能的。知道代码是否调用某个函数(在这种情况下为resolve
)与halting problem一样困难。有证据表明,没有算法可以始终确定这一点。
为说明起见,我们假设存在确定函数调用resolve
是否可用的算法,并且该算法可通过函数callsResolve(func)
使用。因此,callsResolve(func)
将在确定true
将调用func
(实际上没有运行resolve
)时返回func
,并在确定false
时返回func
。 resolve
将不呼叫func
。
现在为这个function func() {
if (!callsResolve(func)) resolve();
}
成像:
callsResolve
...现在我们有一个悖论:无论对callsResolve
的调用返回什么,都是错误的。因此,例如,如果func
的实现会(同步)模拟 false
的执行,并确定在预定义的超时后它应该返回resolve
,以上是该超时结束后立即调用androidx.appcompat.widget.AppCompatRadioButton
的函数的演示。
,
最接近编译时检查的地方是使用异步/等待语法。
如果您不想使用它,则可以使您的诺言超时,尽管您必须在创建诺言之后/之后对每个诺言进行兑现。
解决方案如下:
export const resolveAfterDelay = (timeout: number) => new Promise((r) => setTimeout(r,timeout));
export const rejectAfterDelay = async (timeout: number) => {
return new Promise((resolve,reject) => setTimeout(() => reject(`Promise timed out as resolve was not called within ${timeout}ms`),timeout));
};
export const timeoutPromise = <T>(timeout: number) => async (p: Promise<T>): Promise<T> => {
return Promise.race([p,rejectAfterDelay(timeout)]);
};
const timeoutAfter1s = timeoutPromise(1e3);
const timeoutAfter10s = timeoutPromise(10e3);
timeoutAfter10s(resolveAfterDelay(3e3)).then(success => console.log("SUCCESS IS PRINTED")).catch(console.error); // works
timeoutAfter1s(resolveAfterDelay(3e3)).then(success => console.log("NEVER REACHED")).catch(console.error); // aborts
const neverResolvingPromise = new Promise(() => {
});
timeoutAfter1s(neverResolvingPromise).catch(console.error); // promise never resolves but it will be rejected by the timeout
它使用Promise.race
。基本上,任何先解决或拒绝的问题都将被退回。如果承诺未能及时解决,我们希望始终拒绝。
您总是必须将Promise包装在类似
的创作上
timeoutAfter10s(new Promise(...));
您将不得不根据用例调整超时时间。
本文链接:https://www.f2er.com/2732452.html