2017-10-13 76 views
1

我是JavaScript概念的新手。 爲什麼我得到不同的輸出爲相同的變量長度? 雖然它在體內顯示預期的結果?無法獲得長度

var length; 
element.all(by.className("className")).getText().then(function(items){ 
    length = items.length; 
    console.log("1st output = "+length);//1 
    console.log("2nd output = "+items.length);//1 
}); 
console.log("3rd output = "+length);//undefined 

輸出: - 1輸出= 1個

第二輸出= 1個

3個輸出=不確定

+2

3rd未定義,因爲它是異步調用。 –

+1

'.then'以異步方式工作,當'.then'裏面的代碼執行了語句'console.log(「3rd output =」+ length)''已經完成它的執行並且當時'length'是undefined ..你可以檢查這個鏈接 https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call – brk

回答

2

因爲你all()是異步調用,這樣完成then鏈之前console.log將運行並賦值爲length

1

element.all(by.className("className")).getText())你的函數調用返回一個叫promise的東西 - 它執行一些代碼,執行這段代碼後,它調用.then()中的函數。但是,這種情況獨立於程序的其餘部分,所以它繼續在.then()聲明後執行console.log

這導致了所謂的競爭條件 - 操作順序可能是未定義的。

+0

我應該怎麼做才能解決它。想要項目的長度。 –

+0

@shankarDayalupadhyay你打算如何使用該項目的長度?有沒有什麼方法可以在同步函數中使用它? –

+0

我想比較外部項目的長度。 –

1

所有之前的答案已經解釋發生了什麼,爲什麼。很明顯,您的第3個console.log在您的then()條件完成之前執行。

什麼,你可以嘗試是這樣的:

var length; 
element.all(by.className("className")).getText().then(function(items){ 
    length = items.length; 
    console.log("1st output = "+length);//1 
    console.log("2nd output = "+items.length);//1 
}); 
browser.waitForAngular(); //add this line to let Protractor wait for Async tasks to be resolved first 
console.log("3rd output = "+length); 

然而,保持第3的console.log()的then()語句內將是更合適的解決方案。

+0

嗨,如果我的應用程序不是角度可以使用browser.waitForAngular()? –

+0

不,這不會作爲'browser.waitForAngular()'在角度特定的對象上解析。我建議以'async/await'作爲純JavaScript方式。無論如何,量角器將在未來12-18個月內在那裏移動。 [閱讀所有關於此處](https://stackoverflow.com/a/46660193/8683679) –

+0

@shankarDayalupadhyay:它沒有工作或者不接受答案的原因是什麼?如果可以的話,我想改進它(因爲看起來你還有一個沒有答案的問題)。 –