我是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
第3次输出=未定义
答案 0 :(得分:2)
由于您的all()
是异步通话,因此console.log
将在您完成then
链并将值分配给length
之前运行
答案 1 :(得分:1)
函数中的element.all(by.className("className")).getText())
调用返回一个名为promise的东西 - 它执行一些代码,执行完代码后,它调用.then()
内的函数。但是,这与程序的其余部分无关 - 因此它会在console.log
语句后继续执行.then()
。
这会导致所谓的竞争条件 - 操作顺序可能未定义。
答案 2 :(得分:1)
所有答案之前已经解释了会发生什么以及为什么。很明显,您的第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);
条件完成之前执行。
您可以尝试的是:
then()
但是,在Sub generate_data()
Application.CutCopyMode = False
Sheets("Output").Activate
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array(Array( _
"ODBC;DSN=HKGHKGT_UBET;Description=HKGHKGT_UBET;UID=SiuH;Trusted_Connection=Yes;APP=Microsoft Office 2016;WSID=HKHKDNO304NB;DATABASE=" _
), Array("UBet")), Destination:=Range("$A$1")).QueryTable
'CommandType = 0
.CommandText = Array("select * from UBet..cathy_fin where duns_no in(" & Sheets("Main").Range("A2").Value & ") order by stmt_date desc")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "HKGHKGT_UBET"
.Refresh BackgroundQuery:=False
End With
ActiveSheet.ListObjects("HKGHKGT_UBET").TableStyle = ""
Columns("B:B").Select
Selection.NumberFormat = "m/d/yyyy"
End Sub
语句中保留第3个console.log()将是更合适的解决方案。