这在 Web 浏览器中是一个简单的任务,但在 NodeJS 中没有区别:
console.log({
// 'Function' in browser, but empty string ('') in NodeJS
'(() => {}).constructor.name': (() => {}).constructor.name,
'(() => {}).__proto__.constructor.name': (async () => {}).__proto__.constructor.name,
// 'AsyncFunction' in browser, but empty string ('') in NodeJS
'(async () => {}).constructor.name': (async () => {}).constructor.name,
'(async () => {}).__proto__.constructor.name': (async () => {}).__proto__.constructor.name,
// Evaluates to false in browser, but true in NodeJS
'(async () => {}).constructor === (() => {}).constructor': (async () => {}).constructor === (() => {}).constructor,
'(async () => {}).__proto__ === (() => {}).__proto__': (async () => {}).__proto__ === (() => {}).__proto__,
'(async () => {}).__proto__.constructor === (() => {}).__proto__.constructor': (async () => {}).__proto__.constructor === (() => {}).__proto__.constructor,
});
我想区分这一点的原因是这样我可以不加区别地添加包装器代码,同时维护函数的“签名”。如果我要将所有内容转换为仅通过
thenable
接受 Promise.resolve
对象,那么我必须将大多数函数调用转换为异步方法(或期望异步 thenable
)。这对于 Nodejs(或 React Native)来说是一个问题,因为它遵循 Promises/A+ 规范,因此不加区别地期望所有内容都是异步的确实会改变代码的功能。
有谁知道如何同时完成此任务或某种解决方法?
我想区分这一点,这样我就可以不加区别地添加包装器代码,同时维护函数的“签名”
那么你不应该关心函数是否是使用
async
/await
语法定义的。
当你调用它时,你应该关心它是否返回一个承诺。而且很容易区分。