首页 > 解决方案 > 这个异步转换的承诺是否正确,为什么不需要等待?

问题描述

我有这个带有承诺的代码片段。

function f (number) {
  return new Promise((resolve, reject) => {
    if (number === 42) {
      resolve({ success : "bar" })
    }

    reject({ bar : "foo" })
  })
}

f(42)
  .then(success)
  .catch(bar);

f(43)
  .then(success)
  .catch(bar);

function success(input) {
  console.log(input)
}

function bar() {
  console.log("marianna")
}

然后尝试将 Promise 转换为 async/await 语法:

async function f (number) {
    if (number === 42) {
      return { success : "bar" }
    }

    throw { bar : "foo" }
}

f(42)
  .then(success)
  .catch(bar);

f(43)
  .then(success)
  .catch(bar);

function success(input) {
  console.log(input)
}

function bar() {
  console.log("marianna")
}

两个脚本给出的输出是相等的。我认为转换是正确的,但我仍然很难“读取”异步代码。

无论如何,..为什么没有必要等待?什么时候需要等待?

标签: node.jsasync-await

解决方案


await可以提高代码阅读能力。它将asynchronous函数调用视为synchronous调用。

在您的示例中,假设我是否想在完成f(43)后运行f(42)。对于这种情况,我可以在下面这样做

f(42)
  .then(() => {
    success(); 
    return f(43);
  })
  .then(success) 
  .catch(bar);

比较await

async function f (number) {
    if (number === 42) {
      return { success : "bar" }
    }

    throw { bar : "foo" }
}

async function run() {
  try {
    const result42 = await f(42); // async function but called like sync function
    success(result42); 
    
    const result43 = await f(43);
    success(result43);
  } catch(error) {
    bar(error);
  }
}

run();

function success(input) {
  console.log(input)
}

function bar() {
  console.log("marianna")
}


推荐阅读