如何将两个函数整合到Promise中实现成功后顺序执行?含耗时函数疑问
如何用Promise实现函数顺序执行及耗时函数的setTimeout疑问解答
一、用Promise实现sum成功后执行print
要让sum执行成功后触发print,关键是把sum包装成返回Promise的函数,再通过.then()链式调用实现顺序执行。
基础改造版本
将sum改成返回Promise的函数,内部计算完成后调用resolve()标记执行成功,触发后续的print:
function sum(){ return new Promise((resolve) => { let array = [3, 5, 4, 8]; let sum = 0; array.forEach(item => { sum += item; }); console.log(sum); // 标记sum执行成功,可传递计算结果(可选) resolve(sum); }); } function print(){ console.log("This function is printed after the sum function if the latter was successful") } // sum执行成功后自动调用print sum().then(print);
带错误处理的版本
如果sum存在执行失败的可能(比如数组为空、数据异常),可以加入reject()捕获错误,避免后续逻辑异常:
function sum(){ return new Promise((resolve, reject) => { let array = [3, 5, 4, 8]; // 模拟错误场景:数组为空时触发失败 if (array.length === 0) { reject(new Error("数组为空,无法计算总和")); return; } let sum = 0; array.forEach(item => { sum += item; }); console.log(sum); resolve(sum); }); } // 链式调用时通过catch捕获错误 sum() .then(print) .catch(err => console.error(err.message));
二、耗时函数是否值得添加setTimeout?
分两种场景判断:
- 同步耗时操作(比如大量循环计算):非常值得加。这类操作会阻塞主线程,导致页面UI卡顿甚至无响应。用
setTimeout(..., 0)把计算逻辑放到宏任务队列,能让主线程先处理UI渲染等紧急任务,提升用户体验。示例:
function heavySum(){ return new Promise((resolve) => { setTimeout(() => { let sum = 0; // 模拟千万级别的计算 for (let i = 0; i < 1000000000; i++) { sum += i; } console.log(sum); resolve(sum); }, 0); }); }
- 异步耗时操作(比如API请求、文件读取):不需要额外加setTimeout。这类操作本身由浏览器/Node.js的异步API处理,不会阻塞主线程,直接用Promise包裹异步逻辑即可。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

