面试题答案
一键面试- 使用函数引用而非匿名函数:
- 当一系列异步操作依赖前一个操作的结果时,我们可以定义具名函数,然后通过函数引用传递给异步操作,而不是每次都创建新的匿名函数。
- 示例代码如下:
// 定义具名函数
function step1() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Step 1 completed');
resolve('Result of step 1');
}, 1000);
});
}
function step2(resultFromStep1) {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Step 2 completed with result:', resultFromStep1);
resolve('Result of step 2');
}, 1000);
});
}
function step3(resultFromStep2) {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Step 3 completed with result:', resultFromStep2);
resolve('Final result');
}, 1000);
});
}
// 链式调用
step1()
.then(step2)
.then(step3)
.then((finalResult) => {
console.log('Final result:', finalResult);
});
- 复用函数逻辑:
- 如果某些步骤的逻辑有相似性,可以进一步优化。例如,如果
step2
和step3
除了日志输出外,处理数据的逻辑相同,可以复用函数逻辑。 - 示例代码如下:
- 如果某些步骤的逻辑有相似性,可以进一步优化。例如,如果
function commonStep(result) {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Step completed with result:', result);
resolve(result + ' processed');
}, 1000);
});
}
function step1() {
return new Promise((resolve) => {
setTimeout(() => {
console.log('Step 1 completed');
resolve('Result of step 1');
}, 1000);
});
}
// 链式调用
step1()
.then(commonStep)
.then(commonStep)
.then((finalResult) => {
console.log('Final result:', finalResult);
});
通过这种方式,我们减少了不必要的函数创建,提高了代码的执行效率,同时也提高了代码的可维护性。