使用重载方法等待

Posted

技术标签:

【中文标题】使用重载方法等待【英文标题】:await with overloaded methods 【发布时间】:2020-02-03 22:57:30 【问题描述】:

我有一个 ES6 类层次结构。层次结构中的所有类都实现了draw() 方法。有些同步实现它,但有些需要此方法为async。 在这种设置中如何正确调用draw()? 是否有可能找到被调用的方法是async,然后才调用await 的结果?

【问题讨论】:

无论draw是否返回promise,你都需要保持一致。 我想避免为了两个真正需要它的方法而将 100 个方法声明为异步方法 这个怎么样? draw.constructor.name == 'AsyncFunction' 【参考方案1】:

您可以检查 draw() 是否具有 .then 函数,因为所有承诺都必须实现它。如果是,则使用异步,否则直接执行

查看此答案以了解如何确定承诺How do I tell if an object is a Promise?

  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()

【讨论】:

函数本身是Promise还是它的返回值是Promise 这似乎是错误的。异步函数没有then @shoosh 我不是最初的回答者,但您需要在 return 上调用 .then(),而不是 draw 函数本身。所有async 函数都会隐式返回一个promise,所以我想这会起作用。 @NickParsons 这似乎是最好的答案 但我假设 draw 是一个存储异步函数的变量,所以,它应该有 draw().then 才能用作承诺?【参考方案2】:

我想避免将 100 个方法声明为异步 只是为了真正需要它的两个人。

函数不必是async(即:返回一个承诺)也可以是awaited。也可以等待同步功能。这意味着如果draw() 没有返回一个promise(即:你的draw() 方法是同步的),那么await 会将draw() 的返回值转换为一个resolved promise,然后等待并检索它它的价值。

因此,可能会出现以下情况:

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() 方法,无论其返回类型如何。

【讨论】:

【参考方案3】:

你可以使用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);

【讨论】:

以上是关于使用重载方法等待的主要内容,如果未能解决你的问题,请参考以下文章

什么是 重载 ?为什么要重载?有何特点?

请简述重载和重写的区别

章节8-重载和重写的区别

java中重载有啥用

GroovyGroovy 运算符重载 ( 运算符重载 | 运算符重载对应方法 )

方法重载