從回撥(callback)到 Promise 到非同步函式(async await)
阿新 • • 發佈:2018-11-28
在 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 執行仍然發生在一個執行緒中,這意味著非同步函式本身不會建立真實的物理執行緒。)