在 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 执行仍然发生在一个线程中,这意味着异步函数本身不会创建真实的物理线程。)