【问题标题】:why setTimeout in async function need to be wrapen again in new Pormise? [duplicate]为什么异步函数中的 setTimeout 需要在新的 Promise 中再次包装? [复制]
【发布时间】:2019-01-16 17:40:09
【问题描述】:

为什么需要在异步函数中使用新的 Promise?

我想了解为什么我的 async/await 代码无法根据 [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 中。

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

【问题讨论】:

  • ()=> { return "hello"; } 不会通知任务已完成。因此,promise 不会得到更新的状态。返回另一个承诺就是这样做的。因此它起作用了。
  • @Rajesh 你能解释一下我添加的例子之间的差异吗:javascript.info/async-await
  • 你有一个async 函数,你告诉代码等待使用await。现在 await 如何知道处理已完成?如果主体已完全执行,或者您像async (done) => { ... fn body; done();} 一样通知它您想启动一个异步任务setTimeout,但您的代码不会等待,因为它将在全局范围内执行。在第二个示例中,您执行resolve(...),这意味着您明确表示任务已完成。因此它有效

标签: javascript async-await es6-promise


【解决方案1】:

async 只是返回承诺的糖。所以当你说

async sleep_not_Working()
{
   setTimeout( ()=> {
        return "hello";
    }, 3000);
}

基本上和这个是一样的:

function sleep_not_Working()
{
    return new Promise((resolve, reject) => {
        setTimeout( ()=> {
            return "hello";
        }, 3000);
    })       
}

但这不是 promise 的工作方式。从内部匿名函数返回不会解决承诺,唯一解决承诺的是resolve('hello')

【讨论】:

    【解决方案2】:

    async 函数返回一个 Promise,该 Promise 解析为 async 函数返回的值。

    在你的代码中……

    async sleep_not_Working()
        {
           setTimeout( ()=> {
                return "hello";
            }, 3000);
        }
    

    sleep_not_Working 没有return 语句,因此它返回undefined

    只有传递给setTimeout 的箭头函数有return 语句,但这是一个不同的函数。


    请注意,在返回显式创建的函数且内部不使用 await 的函数上使用 async 关键字是没有意义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      相关资源
      最近更新 更多