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代码来测试我上面所写的内容,并且一切正常。