Javascript 执行嵌套';而';承诺中的循环

Javascript 执行嵌套';而';承诺中的循环,javascript,promise,Javascript,Promise,我试图在我的承诺中创建一些嵌套的'while'循环。当我执行log.asyncCall()时,我开始在innerFunc中遇到麻烦。然后(…)我的IDE告诉我,arrow函数将立即直接跳转到。然后()包含return innerFunc()的语句,甚至不进入if语句。我认为比赛条件没有按照我希望的顺序执行 总结我正在努力实现的目标: 根据outerFunc我想执行innerFunc这3次 只要log不是null,什么innerFunc会反复调用.asyncCall()。如果innerFunc无法

我试图在我的承诺中创建一些嵌套的
'while'
循环。当我执行
log.asyncCall()时,我开始在
innerFunc
中遇到麻烦。然后(…)
我的IDE告诉我,arrow函数将立即直接跳转到
。然后()
包含
return innerFunc()
语句,甚至不进入
if语句。我认为比赛条件没有按照我希望的顺序执行

总结我正在努力实现的目标:

根据
outerFunc
我想执行
innerFunc
这3次

只要
log
不是
null
,什么
innerFunc
会反复调用
.asyncCall()
。如果
innerFunc
无法生成
log
,请退出
'while'
循环

我也很难找到调试承诺的好方法。我目前正在使用WebStorm的调试功能

var i = 0 
const outerFunc = () => {
  return new Promise(resolve => {
    if (i < 3) {
      i++
      const innerFunc = () => {
        return new Promise(resolve => {
          return log.asyncCall().then(lg => {
            if (lg) {
              // some logic
            } else {
              resolve()
            }
          }).then(() => {
            // continue iterating innerFunc()
            return innerFunc();
          });
        })
      };
      // first iteration innerFunc()
      return innerFunc().then(() => {
        // once innerFunc() is complete, reiterate outerFunc()
        return outerFunc();
      });
    } else {
      resolve();
    }
  });  
}
var i=0
常量outerFunc=()=>{
返回新承诺(解决=>{
如果(i<3){
我++
常量innerFunc=()=>{
返回新承诺(解决=>{
返回log.asyncCall().then(lg=>{
if(lg){
//一些逻辑
}否则{
解决()
}
}).然后(()=>{
//继续迭代innerFunc()
返回innerFunc();
});
})
};
//第一次迭代innerFunc()
返回innerFunc()。然后(()=>{
//完成innerFunc()后,重申outerFunc()
返回outerFunc();
});
}否则{
解决();
}
});  
}

您正在使用承诺反模式,因为您正在将一个承诺包装到另一个承诺中

我强烈建议将
innerFunc
从内部范围中删除,并将其改写为:

const doLogging = () => {
    return log.asyncCall().then(result => {
        if (result) {
            // do stuff
            ...
            return doLogging();
        }
    });
}
无需使用
else
分支-内部arrow函数将隐式返回
未定义的
,然后由
包装。然后
成为一个承诺

然后您要运行此
计数
次:

const repeatPromise = (f, count) => {
    if (count > 0) {
        return f().then(() => repeatPromise(f, count - 1));
    } else {
        return Promise.resolve();
    }
}

const outerFunc = () => repeatPromise(doLogging, 3);
在此函数中,
else
分支是确保最终结果始终是承诺所必需的


(注意:如果传递的函数不返回承诺,
repeatPromise
函数将无法正常工作)

NB:
。然后(()=>{return innerFunc()})
最好写为
。然后(innerFunc)
,您是否希望
log.asyncCall
中使用的
log
变量具有从上一次迭代中接收到的值?(它没有)@Alnitak抱歉变量中的错误选择names@Liondancer我没有足够的钱继续下去。FWIW,我确实编写了一些node.js代码来测试我上面所写的内容,并且一切正常。