异步回调:在JavaScript中,异步回调是一种处理异步操作(如网络请求、定时器等)完成后的结果的方式。当异步操作完成时,回调函数会被调用。
Promise:Promise是ES6引入的一种处理异步操作的新方式。它表示一个异步操作的最终完成(或失败)及其结果值的状态。Promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。
setTimeout:setTimeout
是JavaScript中的一个全局函数,用于在指定的毫秒数后执行一个函数。它返回一个代表定时器的数值ID。
Promise:
.catch()
方法来捕获异步操作中的错误。.then()
方法链式调用,使得异步操作更加直观和易于管理。setTimeout:
setTimeout
函数简单,易于理解和使用。Promise:
new Promise((resolve, reject) => {})
:创建一个新的Promise对象。.then((value) => {}, (error) => {})
:指定Promise对象状态变为fulfilled或rejected时的回调函数。.catch((error) => {})
:指定Promise对象状态变为rejected时的回调函数。setTimeout:
setTimeout(function, delay)
:在指定的延迟时间后执行函数。clearTimeout(timeoutId)
:取消由setTimeout
设置的定时器。Promise:
fetch
或axios
库进行HTTP请求。fs.promises
模块读取文件。setTimeout:
问题:Promise链式调用中,某个.then()
方法没有返回值,导致后续的.then()
方法无法获取到预期的值。
原因:在Promise链式调用中,每个.then()
方法都应该返回一个值(可以是Promise对象),以便后续的.then()
方法可以继续处理。
解决方法:
new Promise((resolve, reject) => {
resolve(1);
})
.then((value) => {
console.log(value); // 1
return value + 1; // 返回值
})
.then((value) => {
console.log(value); // 2
return new Promise((resolve) => {
setTimeout(() => {
resolve(value + 1);
}, 1000);
});
})
.then((value) => {
console.log(value); // 3
});
问题:使用setTimeout
时,定时器的执行时间不准确。
原因:浏览器的事件循环机制可能导致setTimeout
的执行时间不准确,尤其是在浏览器忙于处理其他任务时。
解决方法:
setInterval
代替setTimeout
,但需要注意处理可能的累积误差。requestAnimationFrame
实现更精确的动画效果。setImmediate
或process.nextTick
来处理定时任务。