await 不等待函数结束

Htp*_*Rad 9 node.js async-await

我是 javascript 新手,我试图实现我的第一个异步等待,但无法弄清楚我的问题出在哪里。

getName() - 应该在 1 秒后返回一个承诺。f() - 应该等待 getName 完成然后打印名称

我错过了什么?

const getName = async () => {
  setTimeout(() => 'xxx', 1000)
};

const f = async () => {
  name = await getName()
  console.log(name)
}

f()
Run Code Online (Sandbox Code Playgroud)

ZER*_*ER0 9

除非你await也在 inside 中使用getName,否则你不需要getName异步,你只需要返回一个Promise; 因为await与承诺一起工作:

const getName = () => 
  new Promise(resolve => setTimeout(resolve, 1000, 'xxx'));

async f() {
  let name = await getName();
  console.log(name);
}

f();
Run Code Online (Sandbox Code Playgroud)

  • 不同之处在于 `async` 将 `returned` 值包装在已履行的承诺中:“异步函数的返回值隐式包装在 `Promise.resolve` 中”(参见:https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Statements/async_function)。因此,当事情发生时(例如等待一秒钟),您没有解决所需的粒度,它将立即解决。基本上它们是等价的:`const a = async () => true` 和 `const b = () => Promise.resolve(true)`。 (2认同)

Mad*_*ard 5

要等待一个函数,该函数必须返回一个承诺。

因此,您需要创建一个新的承诺。它将有 2 个方法:resolve、 和reject

  1. resolve返回变量,并在成功时使用。promise.then(value => )您可以通过使用或awaiting捕获它的返回值。
  2. reject抛出错误,并在错误时使用。promise.catch(err => )您可以通过使用或等待异步函数并将其包装在 try-catch 块中来捕获错误。

您的代码应如下所示:

const getName = async () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('xxx');
    }, 1000)
  })
};

const f = async () => {
  name = await getName()
  console.log(name)
}

f()
Run Code Online (Sandbox Code Playgroud)