javascript - 如何在 settimeout 内解析异步函数

标签 javascript node.js

如何仅使用 async、await 编写此代码:

new Promise((resolve, reject) => { 
 setTimeout(() => {
   resolve(‘done’)
 }, 1000)
}

最佳答案

你不能。 asyncawait 的作用是它们可以替换 .then,例如:

function foo(someProm) {
  return someProm.then(() => {
    console.log('someProm done');
  });
}

可以变成

async function foo(someProm) {
  await someProm;
  console.log('someProm done');
}

如果返回值是同步的,它们还可以自动将返回值包装在 Promise 中 - 例如

async function foo() {
  return '2';
}

将返回一个解析为 2 的 Promise。

但是asyncawait不能取代通用的Promise构造函数。如果您有一个基于回调的 API,并且您想要一个在回调完成时解析的 Promise,则您不能使用 asyncawait 来完成该任务 - 您必须像您在这里所做的那样使用new Promise


有一个异常(exception)几乎不值一提,不应该使用。在 setTimeout 的特殊情况下,当 Promise 创建和解析之间不需要执行任何其他操作时,理论上可以创建一个 async 函数,该函数< em>阻塞您需要的秒数,然后解析:

console.log('start');

// Putting this in a setTimeout so that "start" logs above
// before the below code starts blocking
setTimeout(() => {
  const theProm = (async () => {
    const t0 = performance.now();
    while (performance.now() - t0 < 1000);
  })();

  theProm.then(() => {
    console.log('done');
  });
}, 100);

(仅供引用。请勿使用该代码)

关于javascript - 如何在 settimeout 内解析异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60273351/

相关文章:

javascript - 了解 { [name : string]: } in Typescript 的用法

python - 从 Electron UI 连接套接字到 python 服务器时出现错误 400(错误请求)

node.js - 在windows下安装nodejs出错

php - 我想通过 HTTP 请求将数据从 Node js 文件发送到 PHP 文件(如 AJAX),但它不起作用,并且我没有收到另一方的响应

javascript - 如何使用sequelize删除数据行?

javascript - 在 adobe acrobat 中计算年龄 javascript

javascript - 抛出错误时函数返回什么 - Javascript

asp.net - Response.Redirect 偶尔会导致错误,但我无法重现它

javascript - 从生产版本的 javascript 代码中删除断言

javascript - 如何用 Sinon 模拟 pg Pool