Async / Await在我的例子中不起作用

时间:2018-05-14 11:24:46

标签: javascript asynchronous async-await settimeout

许多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`); })(); 。哪部分我做错了或者我不知道呢?

5 个答案:

答案 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次调用。