使用重载方法等待
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
(即:返回一个承诺)也可以是await
ed。也可以等待同步功能。这意味着如果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);
【讨论】:
以上是关于使用重载方法等待的主要内容,如果未能解决你的问题,请参考以下文章