一个非常简单的问题,我知道当我编写这样的异步函数时:
const res = (async () => 'hello')();
console.log(await res);
它应该记录为:“ hello”
但是,可以说我想使异步函数中的结果超时,我必须创建一个新的Promise,以便可以将超时回调包装在其中,如下所示:
const res = (async () =>
new Promise(resolve =>
setTimeout(
() => resolve('hello'), 1000
)
)
)();
console.log(await res);
好吧,如果异步已经返回了一个Promise,为什么我需要在一个已经存在Promise的函数中创建一个新的Promise,来做这样简单的事情? 我是否缺少某些东西,或者确实是这样设计的? 如果我可以以一种本机的方式做这样的事情会更好吗?可能吗 例如:
const res = (async () =>
setTimeout(
() => resolve('hello'), 1000
)
)();
console.log(await res);
答案 0 :(得分:2)
最终,您需要将“回调样式”功能转换为承诺,因此您无法真正兑现该承诺。如果您认为这有点丑陋,我建议您使用或构建一个实用程序函数来为您完成此操作。
此外:除非您在函数中使用await
,否则没有充分的理由将其标记为异步。更好:
const res = new Promise(resolve =>
setTimeout(
() => resolve('hello'),
1000
)
);
console.log(await res);
我认为考虑异步/等待的一种好方法是,它使某些promise-patterns的编写更容易,但是并非所有您可以用一个简单的promise做的事也可以通过async / await完成。异步/等待使通用模式(MUCH)更清晰易懂。
答案 1 :(得分:2)
通常来说,new Promise
是用于旧式回调的。理想情况下,您希望尽可能避免使用它们。
因此,在您的示例中,您使用setTimeout
,然后解析字符串hello
。代替执行此操作,创建延迟函数会更有意义,您可以再次使用该函数,然后只返回"hello"
例如
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
async function test() {
const res = (async () => {
await delay(1000);
return "hello";
})();
console.log(await res);
}
test();
答案 2 :(得分:1)
好吧,如果异步已经返回了一个Promise,为什么我需要在一个已经存在Promise的函数中创建一个新的Promise,来做这样简单的事情?
async
函数具有三个功能:
await
这使它成为管理其他返回承诺的函数的绝佳工具,因为它使您可以使用await
并编写不使用大量回调的代码。>
没有使它成为替换Promise
的所有其他用途的通用工具。
您仍然需要一个。
例如:
const res = (async () => setTimeout( () => resolve('hello'), 1000 ) )(); console.log(await res);
如果这行得通,那么resolve
函数就会冒出来,而return
值不会是函数解析为的值。
它将失去async
函数的优势之一。
JavaScript是一个很大的工具箱。不同的工具适合不同的工作。