从回调(callback)到 Promise 到异步函数(async await)

在 promise 被加入到 JavaScript 语言之前,异步代码一般使用基于回调的 API,尤其是在 Node.js 中。这是一个例子:

function handler(done) {
  validateParams((error) => {
    if (error) return done(error);
    dbQuery((error, dbResults) => {
      if (error) return done(error);
      serviceCall(dbResults, (error, serviceResults) => {
        console.log(result);
        done(error, serviceResults);
      });
    });
  });
}

当嵌套回调变的越来越深以后,我们称这种模式为“回调地狱”,因为它使代码不易读取且难以维护。

幸运的是,现在 promise 成了 JavaScript 语言的一部分,相同的代码可以以更优雅和可维护的方式编写:

function handler() {
  return validateParams()
    .then(dbQuery)
    .then(serviceCall)
    .then(result => {
      console.log(result);
      return result;
    });
}

最近,JavaScript 开始支持了 异步函数。现在可以用与同步代码非常相似的方式编写上述异步代码:

async function handler() {
  await validateParams();
  const dbResults = await dbQuery();
  const results = await serviceCall(dbResults);
  console.log(results);
  return results;
}

使用异步函数,代码变得更加简洁,并且数据流更容易控制,尽管执行仍然是异步的。(请注意,JavaScript 执行仍然发生在一个线程中,这意味着异步函数本身不会创建真实的物理线程。)

猜你喜欢

转载自blog.csdn.net/Corey_mengxiaodong/article/details/84580442