我正在尝试在我的承诺中创建一些嵌套的'while'
循环。当我执行innerFunc
时,我的log.asyncCall().then(...)
开始遇到麻烦我的IDE立即告诉我,箭头函数将直接跳转到包含.then()
的{{1}}甚至没有进入return innerFunc()
。我认为竞争条件没有按照我希望的顺序执行。
我想要实现的目标摘要:
根据if statement
我想要执行outerFunc
3次。
只要innerFunc
不是innerFunc
,.asyncCall()
会一遍又一遍地呼叫log
。如果null
无法生成innerFunc
,请退出log
循环。
我也很难找到调试promises的好方法。我目前正在使用'while'
的调试功能。
WebStorm
答案 0 :(得分:1)
你正在使用Promise反模式,因为你在另一个承诺中包含了一个承诺。
我强烈建议从内部范围中取出Sub LoopTroughWorkSheetsAndFindPA()
Dim wb As Workbook: Set wb = ThisWorkbook 'anyreference of a workbook you want
Dim ws As Worksheet
For Each ws In wb.Worksheets
If ws.Name Like "PA###.##" Then
'do some operations here for example ->
Debug.Print ws.Name
End If
Next
End Sub
,然后重写它:
innerFunc
不需要const doLogging = () => {
return log.asyncCall().then(result => {
if (result) {
// do stuff
...
return doLogging();
}
});
}
分支 - 内部箭头函数将隐式返回else
,然后undefined
将.then
包裹到Promise中。
然后,您希望运行此count
次:
const repeatPromise = (f, count) => {
if (count > 0) {
return f().then(() => repeatPromise(f, count - 1));
} else {
return Promise.resolve();
}
}
const outerFunc = () => repeatPromise(doLogging, 3);
在此函数中,else
分支是必要的,以确保最终结果始终是Promise。
(注意:如果传递的函数没有返回Promise,则repeatPromise
函数无法正常工作)