2016-05-07 4 views
0

コード1findElementsの結果をどのように処理するのですか?

resultsBoard.findElements(By.css(mySelector)).then(function(elements) { 
    elements.forEach(function(val, idx) { 
    elements[idx].getText().then(function(text) { 
     console.log(text); 
    }); 
    }); 
}); 

コード2

resultsBoard.findElements(By.css('mySelector')).then(function(elements) { 
    for (var idx = 0; idx < elements.length; idx++) { 
    elements[idx].getText().then(printText(text)); 
    } 
}); 

コード1がうまく機能し、私のセレクタに一致するすべての要素のテキストを取り出します。 コード2は私に

ReferenceError: text is not defined

どのような違いがありますか?なぜこれが起こるのですか?

答えて

2

2番目のスニペットでは、textが既に定義されていることを期待して、関数(printText)を呼び出す呼び出し括弧が追加されます。これらのカッコは、1番目のスニペットには存在しません。

elements[idx].getText().then(printText(text)); 

// is equivalent to... 

var _result = printText(text); 
elements[idx].getText().then(_result); 

引数として指定された関数を提供するために、あなただけの変数としてその名前を使用したいと思う:

elements[idx].getText().then(printText); 
+0

それは今完全に透明です。私のJSHintガターは私に外部の関数を作成するように指示していたので、printText関数を無視しました。私はその違いがforEachから来ることを期待していました。ありがとう –

1

最初の例では:

elements[idx].getText().then(function(text) { 
    console.log(text); 
}); 

.then(function(text))パートは実際にgetText()から取得したデータに名前(テキスト)を与えているので、次の行に使用することができます。 2番目の例ではこれを実行していません。

だから、あなたはそれが仕事を得るためにこのような何かにあなたの第二の例を書き直す必要があります。

resultsBoard.findElements(By.css('mySelector')).then(function(elements) { 
    for (var idx = 0; idx < elements.length; idx++) { 
    elements[idx].getText().then(function(text) { 
     printText(text); 
    }); 
    } 
}); 
関連する問題