许多JavaScript
开发人员都了解async/await
及其优势,因此我尝试测试一个旧的异步操作示例,让我们看看我的实验:
毫无疑问,以下代码的答案是:
/*Line: 1*/ console.log(`1`);
/*Line: 2*/ console.log(`2`);
/*Line: 3*/ console.log(`3`);
//==> 123
所以我想把setTimeout
换成第二行:
/*Line: 1*/ console.log(`1`);
/*Line: 2*/ setTimeout(() => {
console.log(`2`);
}, 0);
/*Line: 3*/ console.log(`3`);
//==> 132
由于第二行的异步操作,2
位于13
之后,因此显示在控制台132
中。
我决定使用新async/await
的{{1}}功能再次查看JavaScript
,所以我写了上面这样的代码:
123
但它不起作用,我在控制台中再次看到(async () => {
console.log(`1`);
await setTimeout(() => {
console.log(`2`);
}, 0);
console.log(`3`);
})();
。哪部分我做错了或者我不知道呢?
答案 0 :(得分:2)
await
等待承诺得到解决。由于setTimeout
不是一个承诺,程序的执行不会等到它被执行。您需要将setTimeout()
包含在promise中,如下面链接的第一个示例中所指定的,以使您的示例按预期工作:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
答案 1 :(得分:1)
setTimeout
未返回承诺。为了使它工作,你必须创建一个函数,返回在setTimeout回调中解析的promise。
(async () => {
console.log(`1`);
await new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
console.log(`2`);
},0);
});
console.log(`3`);
})();

答案 2 :(得分:1)
您只能等待返回承诺的函数。请注意,await只能在异步函数中使用:
async function someFunc() {
console.log(`1`);
await new Promise((resolve, reject) => setTimeout(() => {
console.log(`2`);
resolve();
}, 0));
console.log(`3`);
}
someFunc();

答案 3 :(得分:1)
应该在返回promise的函数上调用Await(否则它只返回)。
import os
import psutil
p = psutil.Process(os.getpid())
for i in range(10):
print(i)
for j in range(5):
mem_usage = p.memory_info().rss / 1024 / 1024
print("{} {} MB".format(j, mem_usage))
不会返回一个promise,所以你应该用一个返回promise的函数来包装它。
在此处详细了解:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
此代码应该完成工作。
setTimeout
答案 4 :(得分:0)
您需要创建功能,例如async function foo() {}
,并在其中进行await
次调用。