【问题标题】:How to loop a promise in for loop and break if condition met如何在for循环中循环promise并在满足条件时中断
【发布时间】:2017-07-28 06:41:15
【问题描述】:

我不熟悉使用 Promise 并打破我的头脑来解决这个问题。我想运行一个脚本,直到在量角器中满足以下代码的条件,但它不起作用。如何解决这个问题?

let counter = 30;
for (let i = 0; i < counter; i++) {

  browser.executeScript(somescript).then((value) => {
    //console.log(value);
    if (value > 0) 
      //do some stuff
    }
    else {
      return; //exit for loop --not working
       //or
      i=counter;// to exit if i and counter value same
    }
  })

}

【问题讨论】:

    标签: javascript typescript promise protractor


    【解决方案1】:

    我有这个 limitedRetry 代码,这似乎是你需要的

    limitedRetry = (cont, fn) => fn().catch(err => cont > 0 ? limitedRetry(cont - 1, fn) : Promise.reject(err));
    

    你的用途是

    limitedRetry(30, function() {
        browser.executeScript(somescript).then((value) => {
            if (value > 0) {
                // do some stuff
                return 'this will be the resolved value of the promise';
            } else {
                return Promise.reject('try again');
            }
        });
    })
    .then(v => console.log(v))
    .catch(err => console.log(err));
    

    【讨论】:

    • 备注:这里假设somescript 总是相同的。 (@JaromandaX 这是真的)。​​
    • true:但我在代码中看不到为什么它不会是的问题
    • @Karthi 我认为这可能是您所需要的。所以我删除了我的答案。
    • 注意:这段代码重试了 30 次,所以总共可以尝试 31 次,将 cont &gt; 0 更改为 cont &gt; 1 或传入 29 而不是 30 :p
    • @JaromandaX,谢谢。你能用打字稿提供吗?我无法修复编译问题以匹配打字稿语法。
    【解决方案2】:

    现在您正在同时触发所有executeScripts,在最坏的情况下,最后一个脚本(结果)可能首先返回。仅当您拥有前一个 executeScript 的结果时,您才应该开始下一个 executeScript

    这可以通过“监听”前一个承诺的结果来完成,并在你知道前一个结果是什么之后调用executeScript。我已经用变量i 替换了somescript,这样结果就更确定了。如果您只是想重试,请参阅其他答案。

    var browser = {
        executeScript: function(i) {
            return Promise.resolve(i);
        }
    }
    
    var initial = Promise.resolve(null);
    for (var i = 0; i < 30; i++) {
        (function(locali) { 
            initial = initial.then(function(prev) {
                if(prev === undefined) return;
    
                return browser.executeScript(locali).then(function (value) {
                    console.log(value);
    
                    if (value < 5) {
                        return value;
                    } else {
                        return;
                    }
                });
            });
        })(i);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 2017-08-01
      • 2010-11-06
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多