为什么异步功能中的setTimeout需要在新的Pormise中重新包装?

时间:2019-01-16 09:37:02

标签: javascript async-await es6-promise

为什么需要在异步功能中使用新的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中。

希望任何承诺的真实性:)

2 个答案:

答案 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关键字是没有意义的。