话说Javascript、TypeScript等脚本语言,是在客户端即浏览器中顺序解释性执行的程序语言,在单线程中同步地一行一行代码执行。要想脚本程序异步执行,得借助回调函数来实现,书写起来非常麻烦。
不妨举个例子来说,用脚本原生方式来写回调函数来实现异步执行:
1 . 被调用者callee.js
function doBiz() {
console.log("begin callee biz.");
//...
//业务逻辑代码
//...
console.log("end callee biz.");
}
function handleFailure() {
console.log("begin callee handler.");
//...
//错误处理代码
//...
console.log("end callee handler.");
}
2. 调用者caller.js
function runScript(scriptFile, onSucceeded, onFailed) {
let scriptObj = document.createElement("script");
scriptObj.src = scriptFile;
scriptObj.onload = onSucceeded;
scriptObj.onerror = onFailed;
document.head.append(scriptObj);
}
function toDoWhenSucceeded() {
console.log("succeed");
doBiz(); //执行异步业务逻辑
}
function toDoWhenFailed() {
console.log("failed");
handleFailure();//执行异步错误处理
}
//第1行代码
console.log("begin caller biz.");
//第2行代码
runScript("./callee.js", toDoWhenSucceeded, toDoWhenFailed);
//第3行代码
console.log("end calleer biz.");
在主脚本程序caller.js中,有三行代码要顺序执行。其中,第1行代码首先执行完成,即控制台输出begin caller biz.
,随即运行第2行代码即runScript
,但这个加载外部脚本程序来执行是需要时间的,故第第3行代码会优先执行完成,即控制台输出end calleer biz.
。
等过了会,会执行完成callee.js的方法,即依次控制台输出begin callee biz.
和end callee biz.
,如此一来实现了异步操作。大家试想这么实现异步操作是不是很麻烦,如果被调用者callee.js再嵌套回调函数,将会是一个什么样境况,简直是梦魇。