2017-07-28 6 views
1

私はPromiseを使用してこれを解決するために私の頭を壊すのが初めてです。私は以下のコードで分度器で条件が満たされるまでスクリプトを実行したいが、うまくいかない。これを修正する方法は?条件が満たされた場合にforループとbreakで約束をループする方法

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

私はあなたがあなたの使用は今、あなたは、同時にすべてのexecuteScript

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 thats true)。 – Caramiriel

+0

真:しかし、なぜそれがでないのだろうという質問のコードでわかりません –

+0

@カーティー私はこれがあなたが必要とするものと考えることができると思います。だから私は私の答えを削除しました。 – Val

0

を発射していることになる

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

必要なものであるように思われるこのlimitedRetryコードを持っています最悪の場合、最後のスクリプト(結果)が最初に返されることがあります。前の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); 
} 
関連する問題