[英]Exit from function after resolving protractor promise
我對 JavaScript 和量角器相當陌生。 我的測試中有一項無法完成的簡單任務。
return deffered.fullfil(true)
我正在嘗試遞歸地執行此操作,下面是我的代碼。 它正在打印 Element found 但在那之后永遠不會退出該函數並超時。
var check_availability = function(counter, totalCount, element){
var deferred = potractor.promise.defer()
if(counter <= totalCount){
browser.wait(function(){
browser.wait(EC.visibilityOf(element),2000)
return element
}).then(function(success){
console.log('Element found.')
return deferred.fulfill(true)
}, function(err){
inprogressTab.click()
.then(() => availableTab .click())
.then(() => check_availability (counter+1 , totalCount, element))
})
} else{
return deferred.reject(false)
}
return deferred.promise
}
PS:這是我正在使用的示例代碼,更正了一些拼寫錯誤和語法。
我在您的共享代碼中看到了幾個語法錯誤。 下面我嘗試修復這些錯誤並提供預期的行為,但仍然不知道inprogressTab
來自哪里。
const check_availibility = function(counter, totalCount, element) {
const deferred = protractor.promise.defer();
if (counter <= totalCount) {
browser
.wait(() => browser.wait(EC.visibilityOf(element), 2000))
.then(
element => {
console.log("Element found.");
return deferred.fulfill(true);
},
err => {
inprogressTab
.click()
.then(() => availableTab.click())
.then(() => check_availibility(counter + 1, totalCount, element));
}
);
} else {
return deferred.reject(false);
}
return deferred.promise;
};
首先,這段代碼有拼寫錯誤。 "deferred" 帶有一個 "f",因此調用promise.deffer()
會產生運行時錯誤。 它應該是.defer()
。 rpotractor
也拼錯了。 您的代碼甚至無法運行。
其次,您正在使用 anitpattern:當您已經從browser.wait
獲得一個承諾對象時,無需創建承諾/延遲。 只需返回那個(或從then
鏈返回的then
)。
此外, return element
是錯誤的返回值。 它同步執行,所以在等待結束之前, then
鏈會過早啟動。 相反,請確保返回browser.wait
返回的承諾。
你可以這樣做:
var check_availibility = function(counter, totalCount, element){
if (counter <= totalCount) {
return browser.wait(function () {
return browser.wait(EC.visibilityOf(element), 2000)
// ^^^^^^
}).then(function () {
console.log('Element found.')
return true;
}).catch(function (err) {
return inprogressTab.click()
// ^^^^^^
.then(() => availableTab.click())
.then(() => check_availibility(counter+1 , totalCount, element))
})
} else {
return protractor.promise.rejected(false);
}
}
請注意,自 EcmaScript2015 以來,JavaScript 具有原生 Promise 支持,因此您可以使用Promise
而不是使用protractor.promise
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.