2017-07-28 142 views
1

我是新來使用承諾,打破我的頭,以解決這個問題。我想運行一個腳本,直到在下面的代碼量角器滿足條件,但它不工作。如何解決這個問題?如何循環在循環中的承諾,打破如果條件滿足

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 
    } 
    }) 

} 

回答

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)); 
+0

備註:這個假設'somescript'總是一樣的。 (@JaromandaX是真的)。 – Caramiriel

+0

真:但我不能在這個問題的代碼明白爲什麼它不會是 –

+0

@Karthi我認爲這可能是你所需要的。所以我刪除了我的答案。 – Val

0

現在你在同一時間發射所有executeScript叫什麼,最糟糕的情況是最後的腳本(結果)可能會首先返回。你應該開始下executeScript只有當你有以前的executeScript的結果。

這可以通過「聽」到先前承諾的結果,並呼籲後,你executeScript完成知道以前的結果。我已將somescript替換爲變量i,以便結果更具確定性。如果您只是在尋找重試,請參閱其他答案。

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); 
}