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+帧每秒速率运行动画,且避免在后台选项卡中运行动画 Nodejsprocess.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);
resolvedCallback和rejectedCallback接受Promise对象传出的值作为参数。