Javascript 为什么异步函数中的setTimeout需要在新端口中重新包装?

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 await]:()

如果我简单地用异步方式包装一个函数,我就得到了一个承诺。 如示例中所示:

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);
    })       
}