Javascript 是一种单线程语言,它只能同时执行一个任务,当程序执行 I/O 操作、等待网络请求或者等待定时事件时,程序不能阻塞等待,必须异步执行。所以,Javascript 实现异步编程是必备技能。
下面是 Javascript 实现异步编程的过程:
1. 回调函数
回调函数是 Javascript 中异步编程的最基本的方式。回调函数实现方式为,将需要等待的函数作为参数传递给另一个函数,在等待函数执行完成之后,再调用回调函数执行相关操作。
示例1:实现一个延时输出的函数:
function printWithDelay(str, delay, callback) {
setTimeout(function(){
console.log(str);
if (callback) {
callback();
}
}, delay);
}
printWithDelay("Hello", 1000, function(){
printWithDelay("world", 1000);
});
上述示例中,用 setTimeout 实现了延迟输出字符串的功能,通过回调函数实现了串行异步执行。执行 printWithDelay("Hello", 1000, function(){printWithDelay("world", 1000);}),先输出 Hello,延迟1s 再输出 world。
2. Promise
Promise 是ES6 中新增的一种异步编程模型,它将回调函数的几个问题封装解决了,比如:回调函数地狱、异常处理等问题。
Promise 包含三个状态:pendding、fulfilled 和 rejected,Promise 的状态由 pendding 转为fulfilled 或者 rejected。
Promise 传递的不是数值,而是 “承诺在未来的某个时间点一定会有一个结果”。
示例2: Promise 异步编程实现串行执行方式:
function printWithDelay(str, delay) {
return new Promise(function (resolve) {
setTimeout(function(){
console.log(str);
resolve();
}, delay);
})
}
printWithDelay("Hello", 1000).then(function () {
return printWithDelay("world", 1000);
})
上述示例中,printWithDelay 函数返回一个 Promise 对象,可以链式调用 then 方法,每次调用 resolved 状态下的 Promise 对象。控制并行执行使用 Promise.all(),控制串行执行使用 Promise.then()。
3. Async / Await
ES8 引入了 Async / Await,它是基于 Promise 的一种语法糖,是异步编程最人性化的发展,是 “Promise 写法” 的进一步简化。
示例3: Async / Await 异步编程的实现方式:
function printWithDelay(str, delay) {
return new Promise(function(resolve){
setTimeout(function(){
console.log(str);
resolve();
}, delay);
})
}
async function execPrintWithDelay() {
await printWithDelay("Hello", 1000);
await printWithDelay("world", 1000);
}
execPrintWithDelay();
上述示例中,execPrintWithDelay 函数添加了 async 关键字,可以使用 await 关键字等待 Promise 对象完成,异步变成同步看起来更符合直觉。可以使用 try / catch 捕获异常。
这就是 JavaScript 实现异步编程的完整攻略,可以使用回调函数、Promise 和 Async / Await 实现异步编程,并实现 Promise 的数据并行和 Async / Await 的数据串行。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript实现异步编程的过程 - Python技术站