gpt4 book ai didi

javascript - 如何以编程方式查找函数是否异步?

转载 作者:搜寻专家 更新时间:2023-10-30 21:49:09 25 4
gpt4 key购买 nike

我正在尝试重写(猴子补丁)Jasmine 框架的 it() 函数,在此过程中,我想知道一个函数是否作为第二个参数传递给 it() 函数是否为 async 类型。我尝试使用 instanceof Promise,因为所有 async 函数都返回一个 promise,但它永远不会解析为 true,也永远不会进入以下代码块中的 if block 。我尝试将所有函数记录到控制台,我发现所有 async() 函数规范的返回类型都是 tslib_1.awaiter(some args..)

这是我的:

let newIt = jasmine.getEnv().it;
jasmine.getEnv().it = function(...args): jasmine.Spec {
// do something.
if(args[1] instanceOf Promise) {
debugger; // never comes in here.
// catch error.
}
return newIt.apply(this, arguments);
}

我在这里做错了什么?谁能指出我正确的方向?

谢谢。

编辑:假设我有以下两个虚拟规范,一个是异步的,另一个是同步的:

异步测试:

const exp = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 500);
});
};

it('asyncTest', async () => {
expect(await exp()).toEqual(1);
}, 600);

同步:

it('testNon', () => {
expect(true).toBe(true);
});

最佳答案

这是 XY 问题。正如 this answer 中指出的那样通常不需要检查它是否是 async 函数,因为这无关紧要。 async 函数只是一个返回 promise 的函数。 () => Promise.resolve()async () => {} 都应该以相同的方式处理。

事实证实,在转译的 TypeScript 代码中无法区分 async 和常规函数 - 它们都只是常规函数。

args[1] instanceOf Promise 不正确,因为函数不会是 Promise 的实例。Monkey-patching 通常以这种方式执行(这不是 Jasmine 或这种情况所特有的):

let newIt = jasmine.getEnv().it;
jasmine.getEnv().it = function(...args): jasmine.Spec {
const fn = args[1];
let newFn;
if (fn.length > 0) {
// async spec with done param
newFn = function (done) {
const result = fn.call(this, done);
if(result instanceOf Promise)
// or even better,
// if(result && typeof result.then === 'function')
debugger;
return result;
}
} else {
newFn = function () {
const result = fn.call(this);
if(result instanceOf Promise)
debugger;
return result;
}
}

args[1] = newFn;
return newIt.apply(this, args);;
}

测试函数 result 应该被检查为 Promise 的一个实例(或者检查它是否可用)。

关于javascript - 如何以编程方式查找函数是否异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49060405/

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