我们知道,JavaScript是单进程执行的,同步操作会对程序的执行进行阻塞处理。比如在浏览器页面程序中,如果一段同步的代码需要执行很长时间(比如一个很大的循环操作),则页面会产生卡死的现象。
所以,在JavaScript中,提供了一些异步特性,为程序提供了性能和体验上的益处,比如可以将代码放到setTimeout()中执行;或者在网页中,我们使用Ajax的方式向服务器端做异步数据请求。这些异步的代码不会阻塞当前的界面主进程,界面还是可以灵活的进行操作,等到异步代码执行完成,再做相应的处理。
一段典型的异步代码类似这样:
- function asyncFunc(callback) {
- setTimeout(function () {
- //在这里写你的逻辑代码
- //...
- //逻辑代码结束,执行一个回调函数
- callback();
- }, 5000);
- }
- function asyncFunc(callback) {
- setTimeout(function () {
- //在这里写你的逻辑代码
- //...
- //逻辑代码结束,执行一个回调函数
- callback();
- }, 5000);
- }
然后我们这样调用:
- asyncFunc(function () {
- console.log("asyncFunc() run complete");
- });
- getAccountInfo(function (data) {
- console.log("get account info successfully:", data);
- }, function () {
- console.error("get account info failed");
- });
这是一种使用了回调函数来控制代码执行流程的方式。这样看起来没问题,也挺容易理解。
但是,如果我们一段代码中,异步操作太多,又要保证这些异步操作是有顺序的执行,那我们的代码就看起来非常糟糕,就像这样:
- asyncFunc(function () {
- console.log("asyncFunc() run complete");
- });
- getAccountInfo(function (data) {
- console.log("get account info successfully:", data);
- }, function () {
- console.error("get account info failed");
- });