因此,我试图编写一个记录HOC,它将接受一个函数并记录该函数的结果。我希望该临时组件能够记录任何函数的结果,无论该函数返回一个Promise还是一个值。这是我到目前为止的内容:
const logFn = (x) => {
return (...args) => {
const result = x(...args);
console.log(`result: ${result}`);
return result;
}
};
我想让这个函数处理x返回promise的情况。我知道一种行之有效的方法(typeof result === object && typeof result.then === function)
,但这似乎很脆弱。我几乎可以肯定,有一种更优雅的方法可以做到这一点,但我一直在努力寻找它。
我在下面列出了一个失败的笑话测试:
import logFn from './logFn';
describe('logFn', () => {
let outputData;
beforeEach(() => {
const storeLog = inputs => (outputData += inputs);
console["log"] = jest.fn(storeLog);
require('./logFn');
outputData = ""
});
it('handles async functions', () => {
const add2P = (x, y) => Promise.resolve(x + y);
const logAdd2 = logFn(add2P);
const expected = add2P(1,2).then((data) => data);
const actual = logAdd2(1,2);
expect(outputData).toBe('result: 3');
expect(actual).toEqual(expected);
})
});
奖励积分,如果可以帮助我清理beforeEach。
答案 0 :(得分:2)
不幸的是,它没有同步记录,但是您可以尝试这样做。
const logFn = (x) => {
return (...args) => {
const result = x(...args);
Promise.resolve(result).then(function(value) {
console.log(`result: ${value}`);
})
return result;
}
};
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve
答案 1 :(得分:1)
虽然此答案与@lemieuxster's answer并没有太大区别,但有一个主要区别。
const logFn = fn => function () {
const result = fn.apply(this, arguments);
Promise.resolve(result).then(value => { console.log(`result: ${value}`); });
return result;
};
例如,如果您要记录成员方法,这将保留调用上下文:
const logFn = fn => function () {
const result = fn.apply(this, arguments);
Promise.resolve(result).then(value => { console.log(`result: ${value}`); });
return result;
};
const foo = {
bar: 'Hello, world!',
doSomething: logFn(function () {
return this.bar;
})
};
foo.doSomething();