在promises中执行嵌套的'while'循环

时间:2017-01-30 07:23:52

标签: javascript promise

我正在尝试在我的承诺中创建一些嵌套的'while'循环。当我执行innerFunc时,我的log.asyncCall().then(...)开始遇到麻烦我的IDE立即告诉我,箭头函数将直接跳转到包含.then()的{​​{1}}甚至没有进入return innerFunc()。我认为竞争条件没有按照我希望的顺序执行。

我想要实现的目标摘要:

根据if statement我想要执行outerFunc 3次。

只要innerFunc不是innerFunc.asyncCall()会一遍又一遍地呼叫log。如果null无法生成innerFunc,请退出log循环。

我也很难找到调试promises的好方法。我目前正在使用'while'的调试功能。

WebStorm

1 个答案:

答案 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函数无法正常工作)