Javascript 不应该';异步返回承诺而不显式地将返回值包装在承诺中?

Javascript 不应该';异步返回承诺而不显式地将返回值包装在承诺中?,javascript,async-await,ecmascript-2017,Javascript,Async Await,Ecmascript 2017,MDN表示 调用异步函数时,它返回一个承诺。当异步 函数返回一个值,承诺将通过 返回值。当异步函数引发异常或某些异常时 值时,将使用抛出的值拒绝承诺 因此,考虑到wait期望一个已解决的承诺,我做错了什么 foo(); 异步函数foo(){ 等待条(); 动物园(); } 异步功能条(){ 设置超时(()=>{ 控制台日志(“bar”); 返回; }, 1000); } 函数zoo(){ 控制台日志(“动物园”); }bar()正在设置超时并返回undefined,这与立即运行超时结束

MDN表示

调用异步函数时,它返回一个承诺。当异步 函数返回一个值,承诺将通过 返回值。当异步函数引发异常或某些异常时 值时,将使用抛出的值拒绝承诺

因此,考虑到
wait
期望一个已解决的承诺,我做错了什么

foo();
异步函数foo(){
等待条();
动物园();
}
异步功能条(){
设置超时(()=>{
控制台日志(“bar”);
返回;
}, 1000);    
}
函数zoo(){
控制台日志(“动物园”);
}
bar()
正在设置超时并返回undefined,这与立即运行超时结束时运行的日志语句不同

因此,
zoo()
运行,然后当超时结束时(1000毫秒后),您会在控制台中看到“bar”

下面是一个没有超时的修改示例:

foo();
异步函数foo(){
等待条();
动物园();
}
异步功能条(){
控制台日志(“bar”);
}
函数zoo(){
控制台日志(“动物园”);

}
在您刚刚发布的链接中,查看
ResolveAfter2秒的代码,然后将其与您的bar()进行比较。注意到什么了吗?@Will,我读了所有的文章和示例,但是我不明白如果异步函数已经通过运行
return返回了
Promise
,那么为什么需要返回
Promise
。文档中说“当调用异步函数时,它返回一个承诺。当异步函数返回一个值时,承诺将用返回的值来解析”@will因此“我知道如何使它工作”,我只是不明白为什么它会这样工作
:)
有趣。退货自动包装在承诺中。这肯定会减少样板的工作量。1)
return
不跨越函数边界。您仅在回调中返回。函数将返回给它的调用者。但您不是回调函数的调用方,浏览器将在超时结束时调用该函数。cal to
setTimeout
本身会立即返回。它没有阻塞。2) 如果显式创建并返回承诺,则不需要异步。如果你想在函数中使用wait,你需要异步。谢谢回复,我完全理解你的代码。在第一个示例中,不需要
async
,它只是一个命令序列;在我已经使用过的第二个示例中,您返回了一个
Promise
,但我不明白,如果异步函数已经通过简单地运行
return
函数
bar
返回
未定义的
来返回
Promise
,那么为什么需要返回
Promise
。在您的原始代码中,您设置了一个超时,这实际上与承诺无关。为了测试异步行为,您需要有一个在超时完成时解析的承诺,这就是我包含第二个示例的原因。好的,但是MDN文档说“当调用异步函数时,它返回一个承诺。当异步函数返回一个值时,承诺将用返回的值解析”。这让我很困惑!承诺立即用
未定义的
值解决。我认为您在考虑承诺的解决方案将导致执行
console.log
语句时感到困惑。
setTimeout
利用浏览器API,在一定时间后将包装函数插入队列。它不能创造承诺。函数设置超时,然后返回
undefined
,承诺值解析为
undefined