【发布时间】:2020-10-13 15:05:01
【问题描述】:
我想知道 ES2017 或更高版本中以下 2 个函数之间是否存在语义差异:
async function returnBool() {
const promise = new Promise(((res, rej) => {
setTimeout(() => {
res(true);
}, 1000);
}));
// returns a boolean
return await promise;
}
async function returnPromise() {
const promise = new Promise(((res, rej) => {
setTimeout(() => {
res(true);
}, 1000);
}));
// returns a boolean wrapped in a promise
return promise;
}
我在 Node 上测试了这两个版本,它们的行为似乎相同。但是,我正在寻找一些保证,即两个版本在语法和语义上都是正确的。
在 C# 等语言中,在 async 方法中声明的返回类型 (Task<TResult>) 与正文中的实际返回类型 (TResult) 之间总是存在差异。从上面的例子来看,在Javascript中似乎不是这样?这是否表明 JS 缺乏严谨性?如果我想从异步方法返回 Promise<Promise<T>> 怎么办? (不太可能,但仍然)
如果有人能指出一些文档或语言标准来澄清这一点,那就太好了。谢谢!
【问题讨论】:
-
async函数总是返回一个承诺。async函数和返回 promise 的函数在功能上没有区别。async唯一允许你做的就是使用await。所以使用第二个实现并删除async。 -
使用返回承诺。
-
乔什·威尔逊是的,它是重复的
-
"如果我想从异步方法返回
Promise<Promise<T>>怎么办?" 这对于 Promise 来说是不可能的,因为它们会自动递归地展平/加入。如果你有new Promise(res1 => res1(new Promise(res2 => res2(42) ))),那只是一个最终产生42的单一级别承诺。在许多情况下,这很好,但它是否完全正确might be up for debate。优点是链接的一些简单性。缺点是有时您可能想要更高级的东西。
标签: javascript async-await ecmascript-2017