嵌套Promise未按预期执行问题排查及无async/await实现方案咨询
解决嵌套Promise执行异常与输出顺序问题
我来帮你分析下问题所在,然后给出不使用async/await的解决方案:
问题根源分析
你的代码有两个核心问题导致不符合预期:
- 全局变量污染:
b()和c()的for循环里都使用了未声明的i,这会让i成为全局变量。当b()的循环第一次执行i=0时,调用c(),c()里的循环会把全局的i从0递增到10,回到b()的循环后,i++变成11,直接不满足i<10的条件,所以b()的循环只执行了1次,最终只输出10次do C。 - Promise未正确等待依赖:
a()里的Promise在调用b()后立刻执行myResolve(),没有等待b()内部的Promise完成,这会导致done A可能在done B之前输出,不符合你期望的顺序。
不使用async/await的解决方案
我们可以通过局部变量隔离和Promise链式传递来修复问题:
function a() { // 让a的Promise等待b的Promise完成后再resolve let myPromise = new Promise(function(myResolve, myReject) { b().then(() => { myResolve(); }); }); myPromise.then(function() { console.log('done A'); }); } function b() { return new Promise(function(myResolve, myReject) { // 使用let声明局部变量i,避免全局污染 for (let i = 0; i < 10; i++) { c(); } myResolve(); }).then(function() { console.log('done B'); }); } function c() { // 同样用let声明局部i for (let i = 0; i < 10; i++) { console.log('do C'); } } a();
代码说明
- 局部变量隔离:在
b()和c()的for循环中用let声明i,这样每个循环的i都是独立的局部变量,不会互相干扰,确保b()的循环能执行10次,每次调用c()输出10次do C,总共100次。 - Promise链式等待:修改
b()让它返回自己的Promise实例,然后在a()的Promise中,等待b()的Promise完成后再调用myResolve(),这样就能保证执行顺序是:100次do C→done B→done A。
测试这段代码,就能得到你期望的输出效果了。
内容的提问来源于stack exchange,提问作者Nathaz
相关产品推荐
相关产品推荐

