1. 程式人生 > >從回撥(callback)到 Promise 到非同步函式(async await)

從回撥(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 執行仍然發生在一個執行緒中,這意味著非同步函式本身不會建立真實的物理執行緒。)