编写返回值或已解决的承诺的函数的最佳方法

时间:2018-09-20 22:37:39

标签: javascript asynchronous promise higher-order-functions

因此,我试图编写一个记录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。

2 个答案:

答案 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();