【发布时间】: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