打字稿检查诺言正文是否不调用`resolve`

是否有任何打字稿配置选项或某种变通办法来检查在resolve回调中是否没有调用new Promise

假设我有一个诺言

new Promise(async (resolve,reject) => {
    try {
        // do some stuff
        // but not calling resolve()
    } catch (e) {
        reject(e)
    }
})

我希望打字稿警告我我没有打resolve()。有可能吗?

我知道我可以使用noUnusedParameters,但是在某些情况下,我仍然需要未使用的参数(例如request内的express.Hanlder,而我仅使用{{1 }}等)

xyzliuyu0 回答:打字稿检查诺言正文是否不调用`resolve`

否,那是不可能的。知道代码是否调用某个函数(在这种情况下为resolve)与halting problem一样困难。有证据表明,没有算法可以始终确定这一点。

为说明起见,我们假设存在确定函数调用resolve是否可用的算法,并且该算法可通过函数callsResolve(func)使用。因此,callsResolve(func)将在确定true将调用func(实际上没有运行resolve)时返回func,并在确定false时返回funcresolve呼叫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

大家都在问