用await调用/ apply / bind

时间:2018-05-15 19:16:24

标签: javascript node.js

我必须使用基于回调的API,但我想保留我的异步函数。这就是为什么我要写一个depromisify函数:

const depromisify = fn => {
  if (!(fn[Symbol.toStringTag] === 'AsyncFunction')) {
    return fn;
  }

  // Can be `async` as the caller won't use assignment to get the result - it's all bound to the `cb`
  return async function () {
    const args = [...arguments];
    const cb = args.pop();

    try {
      return cb(null, await fn.apply(this, args));
    } catch (e) {
      return cb(e);
    }
  };
};

const normal = function(cb) {
  this.hello();
  cb(null, true);
};

const promised = async function() {
  this.hello();
  return true;
};

function Usual(fn) {
  this.random = 'ABC';
  fn.call(this, (err, result, info) => {
    console.log((err && err.message) || null, result);
  });
};

Usual.prototype.hello = () => {
  console.log('hello!');
};

new Usual(normal);
new Usual(depromisify(promised));

然而,当我尝试去除箭头函数时,它将不起作用,因为你无法绑定任何东西:

new Usual(depromisify(async () => {
  this.hello();
  return false;
}));

有解决方法吗?

1 个答案:

答案 0 :(得分:4)

不。没有解决方案。在这方面,箭头功能有点特殊。

以下是文档的引用:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Description

  

影响箭头功能引入的两个因素:更短   功能和非约束力。