2015-04-27 25 views
-1

我得到了一個json對象數組,其中包含「USERS」列表。我使用用於循環,然後調用另一個函數的用戶javascript中的for循環內的函數獲取第二個值而不是第一個值

//Check for User if already existed or not 
queryUserEmail = function(User){ 
    return emailQueryElement.sendKeys(User,protractor.Key.ENTER).then(function(){ 
     return usersListElement.all(by.css('.shortHand')).getText().then(function(text){ 
      if(text.toString().indexOf(User)!=-1){ 
       return true; 
      }else{ 
       return false 
      }; 
     }); 
    }); 
}; 

this.createUser = function(userArray){ 
for(var userI=0;userI<userArray.length;++userI){ 
     var UserEmail = userArray[userI].UserEmail; 
     logger.info('UserEmail outside function::'+UserEmail); 
     queryUserEmail(UserEmail).then(function(checkFlag){ 
      logger.info('UserEmail inside funtion::'+UserEmail); 
     }); 
    }; 
}; 

和用戶陣列中是否包含兩個用戶,試圖迭代陣列通當我試圖運行該函數,對於外部函數USEREMAIL第一迭代具有陣列第一個用戶的電子郵件,但在函數內部,userEmail具有第二個用戶的電子郵件。

我在這裏錯過了什麼嗎?

+0

這已經回答了,但讓我澄清。 .then()返回一個promise,這是JavaScript將在其他函數和代碼之後執行的事情。它不是自動執行它,而是讓for循環再次運行,然後它終於說:「哦,我只是找到時間來真正運行此功能。」那時候,UserEmail已經被增加了一次,所以它只會用新的UserEmail運行checkFlag函數。 –

+0

@Junior Dev,我現在明白了。謝謝。 –

回答

1

聽起來像是異步/關閉問題。如果是這樣,包裝在一個函數閉包(IIFE)的queryUserEmail功能:

for (var userI = 0; userI < userArray.length; ++userI) { 
    var UserEmail = userArray[userI].UserEmail; 
    logger.info('UserEmail outside function::' + UserEmail); 
    (function (uEmail) { 
     queryUserEmail(uEmail).then(function(checkFlag){ 
      logger.info('UserEmail inside funtion::' + uEmail); 
     }); 
    }(UserEmail)) 
}; 

的時候then火災(的queryUserEmail一個屬性),則for循環已完成並UserEmail是最後分配的用戶。

+0

謝謝你的建議。這很奏效。 –

相關問題