在您给出的两个示例中,代码实质上都会以相同的方式工作。但是有一个需要注意的地方,标记一个函数为async
会确保该函数返回一个Promise
对象。在您的代码中,这可能不是问题,除非您拼写错误地调用了fetchData
,而调用者正尝试使用.then()
、.catch()
等方法处理结果。
例如:
async function test1() {
return fetchDataOops();
}
function test2() {
return fetchDataOops();
}
function handleError(name) {
return e => {
console.log(`Handled error for ${name} and it was ${e.toString()}`);
}
}
test1().catch(handleError('test1'));
test2().catch(handleError('test2'));
请注意,在test2
中,错误没有被捕获处理。如果完全使用async/await
逻辑,这种差异将不会产生影响,因为try / catch
结构可以处理这两种情况。
因此,在某些方面,可以说case A
为你提供了一点额外的代码安全性,特别是在函数混合了async
和sync
操作,并且你也在使用.then
、.catch
处理器的情况下。
这样做会有微小的性能开销,当我提到“微小”时,确实是非常小的(但在循环次数非常密集的情况下,累积起来可能会有影响)。基本上,在您的例子中,额外创建了一个Promise,这个Promise又返回了一个Promise。另外,正如评论中提到的那样,还可以认为case - A
提供了更多关于意图的详细信息,即:在Case B中,如果不阅读代码并知道fetchData
也是一个Promise
,则无法直接看出该函数是否返回Promise;而在Case A
中,则可以直接表明它返回Promise。