Javascript 为什么异步函数中的setTimeout需要在新端口中重新包装?
为什么需要在异步函数中使用新承诺 我想了解为什么我的异步/等待代码不能按照[async await]:() 如果我简单地用异步方式包装一个函数,我就得到了一个承诺。 如示例中所示:Javascript 为什么异步函数中的setTimeout需要在新端口中重新包装?,javascript,async-await,es6-promise,Javascript,Async Await,Es6 Promise,为什么需要在异步函数中使用新承诺 我想了解为什么我的异步/等待代码不能按照[async await]:() 如果我简单地用异步方式包装一个函数,我就得到了一个承诺。 如示例中所示: async function f() { return 1; } f().then(alert); // 1 但当我像这样包装setTimeout代码时,它不起作用: let hello = await this.sleep_not_Working(); async sleep_not_Working()
async function f() {
return 1;
}
f().then(alert); // 1
但当我像这样包装setTimeout代码时,它不起作用:
let hello = await this.sleep_not_Working();
async sleep_not_Working()
{
setTimeout( ()=> {
return "hello";
}, 3000);
}
我知道这个代码可以用,我只是不明白为什么
let hello = await this.sleep_Work();
async sleep_Work()
{
return new Promise((resolve)=>( setTimeout(()=> {
resolve("hello");
}, 3000)));
}
就像上面的例子一样,我希望得到一个承诺,因为我将它包装在异步头中
希望任何承诺都真实:)一个
async
函数返回一个承诺,该承诺解析为async
函数返回的值
在你的代码中
sleep\u not\u Working
没有return
语句,因此它返回undefined
只有传递给setTimeout
的箭头函数才有return
语句,但这是另一个函数
请注意,对于返回显式创建的函数而不在内部使用
wait
的函数,使用async
关键字是毫无意义的。async
只是返回承诺的糖分。所以当你说
async sleep_not_Working()
{
setTimeout( ()=> {
return "hello";
}, 3000);
}
这基本上与此相同:
function sleep_not_Working()
{
return new Promise((resolve, reject) => {
setTimeout( ()=> {
return "hello";
}, 3000);
})
}
但这不是承诺的工作方式。从内部匿名函数返回不会解析承诺,唯一解析承诺的是
resolve('hello')
()=>{return“hello”;}
不会通知任务已完成。因此,promise不会获得更新状态。回报另一个承诺可以做到这一点。因此它是有效的。@Rajesh你能解释一下我添加的例子中的不同之处吗:你有一个async
函数,你用wait
命令代码等待。现在,Wait如何知道处理已完成?如果正文已完全执行,或者您通知它,如async(done)=>{…fn body;done();}
您希望启动一个setTimeout
,这是一个异步任务,但您的代码不会等待,因为它将在全局范围内执行。在第二个示例中,您执行resolve(…)
,这意味着您明确表示任务已完成。因此它起作用了
function sleep_not_Working()
{
return new Promise((resolve, reject) => {
setTimeout( ()=> {
return "hello";
}, 3000);
})
}