JavaScript异步编程

事件模型

JavaScript是一种动态的单线程语言。

JavaScript处理器在线程空闲之前永远不会运行。JavaScript代码永远不会被中断,因为事件在代码结束运行前不会被触发。

如果队列中至少有一个事件适合于触发,则环境随机挑选一个触发。

for (var i = 1; i <= 3; ++i) {
  setTimeout(function () {
    console.log(i);
  }, 0);
}

// 4; 4; 4
for (let i = 1; i <= 3; ++i) {
  setTimeout(function () {
    console.log(i);
  }, 0);
}

// 1; 2; 3;
// 使用let每次都会绑定新的值。

异步函数

  • IO函数 XMLHttpRequest对象
  • 计时函数 setTimeout, setInterval 浏览器端 requestAnimationFrame 允许以60+帧每秒速率运行动画,且避免在后台选项卡中运行动画 Nodejs process.nextTick 尽可能快地触发

垫片技术(Shim) 如果浏览器支持requestAnimationFrame则使用,否则退而求其次使用setTimeout

异步函数测试

异步函数永远可以通过以下测试:

var functionHasReturned = false;
asyncFunction(function () {
  console.assert(functionHasReturned);
});
functionHasReturned = true;

间或异步函数

函数有些时候是异步的,但其他时候却不然。

用回调储存取缔异步递归

避免使用“异步递归”

Promise技术

const promise = new Promise((resolve, reject) => {
  // 业务逻辑

  if (/* 异步操作成功 */) {
    resolve(value);
  } else {
    reject(error);
  }
});

resolve使Promise状态变为resolved

promise.then(resolvedCallback, rejectedCallback);

resolvedCallbackrejectedCallback接受Promise对象传出的值作为参数。