为什么需要在异步功能中使用新的Promise?
我想了解为什么我的异步/等待代码无法按照[async-await]:(https://javascript.info/async-await)
工作如果我只是将函数包装在async中,则会得到一个Promise。 像示例中一样:
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)));
}
就像上面的示例一样,我期望得到一个诺言,因为我将其包装在异步Header中。
希望任何承诺的真实性:)
答案 0 :(得分:2)
async
只是兑现承诺的糖。所以当你说
async sleep_not_Working()
{
setTimeout( ()=> {
return "hello";
}, 3000);
}
基本上与此相同:
function sleep_not_Working()
{
return new Promise((resolve, reject) => {
setTimeout( ()=> {
return "hello";
}, 3000);
})
}
但这不是承诺的实现方式。从内部匿名函数返回并不能解决承诺,唯一可以解决承诺的就是resolve('hello')
答案 1 :(得分:1)
async
函数返回一个Promise,该承诺将解析为async
函数返回的值。
在您的代码中……
async sleep_not_Working() { setTimeout( ()=> { return "hello"; }, 3000); }
sleep_not_Working
没有return
语句,因此它返回undefined
。
只有传递给setTimeout
的arrow函数具有return
语句,但这是一个不同的函数。
请注意,在返回显式创建的函数且内部不使用async
的函数上使用await
关键字是没有意义的。