2016-10-14 6 views
2

ページに約50行と列からなるテーブルがあります。私はテーブルからすべての行をフェッチし、すべての単語の2番目の列に 'Silver'という単語が含まれているかどうかをチェックする関数を作成します。私はコードの下で試してみましたが、うまくいきません。誰かが私が逃しているところで助けてもらえますか?私はJavascriptの約束でそれほど大きくはありません。 stringとの一致が見つかった場合は、カウントをインクリメントし、最後にcountを返すだけです。テーブルのすべての行で検証の問題

fetchValues(SearchString){ 
     var matchcount=0; 
     var count = this.ContentTable.Rows.count(); 
     for (var i=0;i<count-1;i++) { 
      return this.ContentTable.element(by.css('[id*="DXDataRow'+i+'"]')) 
      .then((Row) =>{ 
       return this.ContentTable.Row.element(by.css('[id*="uxSetList_tccell'+i+'_1"]')) 
       .then((Column)=>{ 
         var CoinInfo = this.ContentTable.Row.Column.element(by.css('a')).getText(); 
         if (CoinInfo.indexOf(SearchString)>=0) 
         { 
          matchcount =matchcount+1 
         } 
         return matchcount; 
       }); 
      });     
     } 
     } 

答えて

1

まず、for()ループ内の値を返します。これはあなたのループが一度だけ実行されることを保証し、あなたは1つの行を調べるつもりです。それはあなたが欲しいものですか? (いいえ、本当に私は分かりません)あなたは約束をたくさん作り、その結果を一つの数字にまとめようとしていますか?あなたが作成したすべての約束の値を組み合わせて、そのメタ約束から値を返すためにPromise.all()を使用する場合があります:

var myPromises = []; 
for (var i = 0; i < count; i++) { 
    myPromises.push(this.ContentTable.element(by.css('[id*="DXDataRow'+i+'"]')) 
    .then(/* ...blah blah blah ... */) 
); 
} 
// return a single value from this function containing data from all promises 
return Promise.all(myPromises).then((promiseResultsArray) => { 
    /* calculate match count */ 
}); 

第二に、私はあなたの約束自体は間違って書かれていると思います。あなたの約束のコールバックがの場合、iの値は、約束のコールバックがと定義されたiの値と同じであると仮定しています。約束事がJSでどのように機能するのかは、実際はそうではありません。何が起こっている

は、あなたのfor()ループが約束の束を作成し、将来でいくつかの未定義の時点では、これらの約束の一つが解決さ、あなたはその.then()メソッドに渡された関数が実行されることをです。この関数は約iを知っています - それは関数本体の中にあります。 - 今はiの値はcount - 1の値に等しいです。ループは終了しました。ループの終了条件は、i === count - 1です。これは、ループが終了した後にすべてが実行されるため、このループで作成するすべての単一の約束に当てはまります。

これはさまざまな方法で修正できます。おそらく最もクリーンはiの現在の値に初期化され、決して変更され、新しい変数を宣言して、あなたの.then()コールバックの内側にそれを参照することです:

var i = 0; 
var myPromises = []; 
for (i = 0; i < count; i++) { 
    var currentCount = i; 
    myPromises.push(this.ContentTable.element(by.css('[id*="DXDataRow'+currentCount+'"]')) 
    .then(/* ...blah blah blah ... */) 
); 
} 
// return a single value from this function containing data from all promises 
return Promise.all(myPromises).then((promiseResultsArray) => { 
    /* calculate match count */ 
}); 

あなたはより多くの情報が必要な場合は、SOの質問の多くがあります約束の使い方について

+0

コードを確認してください。なぜforループがここで動作しないのか分かりません。私はカウント値を返す場合、私は50として値を与えている。私は50とループのカウント内部を置き換える場合また、それは私に50を正しく与えている。カウントを整数に変換する必要がありますか? 'fetchssd(){ var matchcount = 0; var count = this.ContentTable.Rows.count(); for(var j = 0; j NewWorld