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
对象传出的值作为参数。