覆盖 Bluebird.Promise 的 Promise 实现

Overriding Promise implementation to Bluebird.Promise

提问人:Mmm Donuts 提问时间:1/31/2023 最后编辑:VLAZMmm Donuts 更新时间:1/31/2023 访问量:100

问:

我有一个场景,对于代码库的某些远程执行,promise 将未定义。在本地,它正在运行 Node。远程地,它运行另一个没有 Promise 的运行时。Bluebird 工作正常,但如果未定义,我想覆盖所有文件的 Promise。

像这样:

import { Promise as BlueBirdPromise } from 'bluebird';

if (!Promise) {
    Promise = BlueBirdPromise;
    Promise.setScheduler((fn: any) => {
        setTimeout(fn, 0);
    });
}

上面的代码不起作用,因为 Promise 和 BlueBirdPromise 是不同的类型。我相信 Promise 是 TS 中的一个接口。

有没有一种干净的方法可以做到这一点?

例:

import { Promise as BlueBirdPromise } from 'bluebird';

BlueBirdPromise.setScheduler((fn: any) => {
    setTimeout(fn, 0);
});
// eslint-disable-next-line
Promise = BlueBirdPromise;

错误:

polyfills.ts:13:1 - error TS2741: Property '[Symbol.species]' is missing in type 'typeof Bluebird' but required in type 'PromiseConstructor'.
JavaScript 打字稿 蓝鸟

评论

0赞 VLAZ 1/31/2023
"上面的代码不起作用,因为 Promise 和 BlueBirdPromise 是不同的类型。我本来以为它不起作用,因为如果环境中缺少,就会抛出 ReferenceError。Promise!Promise
0赞 Mmm Donuts 1/31/2023
正确 - 以上只是伪代码 (ish)。if 条件不是关键 - 只是我想在这里做的一个例子。
0赞 VLAZ 1/31/2023
还行。但是,伪代码式的示例使您很难弄清楚您面临的实际问题是什么。你能不分配给吗?如果是这样,为什么 - 编译器错误是什么?BlueBirdPromisePromise
0赞 Mmm Donuts 1/31/2023
错误是:Property '[Symbol.species]' is missing in type 'typeof Bluebird' but required in type 'PromiseConstructor'
1赞 VLAZ 1/31/2023
解决方案应作为答案发布,而不是问题的一部分。

答:

0赞 Mmm Donuts 1/31/2023 #1

我们可以通过覆盖绑定到全局对象的 Promise 定义来实现这一点。这是在执行任何主代码之前在文件中完成的。index.js

在本地,Visual Studio Code 将识别为其默认类型。但是,在执行时,此块将使用 提供的默认定义覆盖默认定义。PromisePromiseBluebird

这样,任何对 的使用都将超过 Node 的定义。或者,如果远程运行时不是节点,则在没有节点的情况下提供实现。PromiseBluebird

import { Promise as BlueBirdPromise } from 'bluebird';

BlueBirdPromise.setScheduler((fn: any) => {
    setTimeout(fn, 0);
});

global.Promise = <any>BlueBirdPromise;

评论

0赞 katniss 1/31/2023
注意:正在转换为任何。在较新的版本中,我们使用 : 。<any>BlueBirdPromiseBlueBirdPromiseasBlueBirdPromise as any
0赞 jasie 1/31/2023
虽然这段代码可能会解决这个问题,但包括解释它如何以及为什么解决这个问题将真正有助于提高你的帖子的质量,并可能导致更多的赞成票。请记住,您是在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释,并指出适用的限制和假设。