жду с перегруженными методами - PullRequest
3 голосов
/ 06 октября 2019

У меня есть иерархия классов ES6. Все классы в иерархии реализуют метод draw(). Некоторые реализуют его синхронно, но некоторые нуждаются в том, чтобы этот метод был async.
Как я могу правильно вызвать draw() в настройках такого типа?
Можно ли определить, является ли вызываемый метод async итолько тогда назовите await на его результат?

Ответы [ 3 ]

3 голосов
/ 06 октября 2019

Вы можете проверить, имеет ли функция draw () функцию .then, поскольку все обещания должны будут реализовывать это. Если это так, используйте async, иначе выполните напрямую

Проверьте этот ответ, чтобы узнать, как определить обещание Как узнать, является ли объект обещанием?

  if(draw.then) {  // all async await functions wrap the return into promises. So, this should 
    const resolvedData = await draw(); // store the data if you need to get the value
  else
    draw()
1 голос
/ 06 октября 2019

Я хотел бы избежать необходимости объявлять (r) e 100 методов асинхронными только для двух, которые действительно нуждаются в этом.

Функция не должна бытьasync (т.е. вернуть обещание) будет await ред. Также можно ожидать синхронную функцию. Это означает, что если обещание не возвращается draw() (т. Е. Ваш метод draw () является синхронным), то await преобразует возвращенное значение draw() в разрешенное обещание, которое затем ожидает и получаетего ценность.

Итак, возможно что-то вроде следующего:

function foo() { // returns a string
  return "foo";
}

async function bar() { // implicitly returns a promise
  return "bar"; 
}

(async function() {
  const fooStr = await foo(); // foo() is synchronous, but can be `await`ed still
  const barStr = await bar(); // bar() is asynchronous, and can be `await`ed
  console.log(fooStr, barStr);
})();

Имея это в виду, вам не нужно знать, является ли draw() синхронным или нет, вместо этого вы всегда можете await метод draw(),независимо от типа возвращаемого значения.

1 голос
/ 06 октября 2019

Вы можете проверить свою функцию, если это асинхронная функция, используя Object.prototype.constructor.name.

var object = {
  draw: async function() {}
}
var object1 = {
  draw: function() {}
}

console.log(object.draw.constructor.name);
console.log(object1.draw.constructor.name);
...