2016-05-25 77 views
0

好吧,我有這段代碼,我正在嘗試,並在寫作失敗。我想要做的是確保傳遞給函數的索引位於頁面上可用元素的範圍內。而且,如果是,則返回一個元素引用。獲得量角器的承諾,變量和結果同步

假設我有以下幾點:

​​3210

所以,我有這樣的功能:

function getRow(index) { 
    // get count of rows. 
    var count = $$('li').count(); 

    // Ensure a parameter has been passed. 
    if (!index) { 
     throw Error("A parameter must be supplied for function getRow. Valid values are 0 through " + count-1); 
    } 
    // Ensure the parameter is within bounds 
    if (index < 0 || index >= count) { 
     throw Error("The parameter, " + index + ", is not within the bounds of 0 through " + count-1); 
    } 

    return $$('li').get(index); 
} 

以上將失敗,因爲數是不是真的算,而是一個承諾。

所以,我試着用各種方法修改它。我以爲會是成功的一個如下:

// get count of rows. 
var count; 
$$('li').count().then(function(c) { count = c; }); 

// get count of rows. 
var count = $$('li').count().then(function(c) { return c; }); 

我已經變得沮喪,並試圖如果拋出整個thenable函數中塊,但不會「看「索引。

(每次我想我已經想通了這一點,我不感謝您的任何和所有幫助!)

UPDATE:

繼建議下面我試着修改我的代碼:

function getRow(index) { 
    //get count of rows. 
    var count = $$('li').count().then(function(c) { 
    return function() { 
     return c; 
    } 
    }); 

    protractor.promise.all(count).then(function(count) { 
    // Ensure a parameter has been passed. 
    if (!index) { 
     throw Error("A parameter must be supplied for function getRow. Valid values are 0 through " + count-1); 
    } 
    // Ensure the parameter is within bounds 
    if (index < 0 || index >= count) { 
     throw Error("The parameter, " + index + ", is not within the bounds of 0 through " + count-1); 
    } 
    }); 

    return $$('li').get(index); 
} 

但因爲失敗了,protractor.promise.all().then()塊內,index是不確定的。此外,在錯誤消息中,我甚至沒有得到count的值。

> getRow(0); 
A parameter must be supplied for function getRow. Valid values are 0 through 
+0

也許是因爲你在單個對象上調用'index'而不是數組(你在你的定位器中缺少'.all')? 'var count = element.all(by.css(...))'help?然後使用'.each'或'.map'等.all函數? [來源](http://www.protractortest.org/#/api?view=ElementArrayFinder.prototype.each) – Gunderson

+0

你是對的。我試圖避免使用速記$$,但轉換失敗。我已經更新了這個問題。 – Machtyn

回答

1

我認爲你必須使用javascript閉包來存檔它。

試試:

var count = element(by.css('li')).count().then(function(c){ 
    return function(){ 
     return c 
    } 
}); 

var value = count(); 

你的價值應該在 「值」 變量。

PS:我沒有一個量角器環境中測試此代碼現在

+0

我收到以下錯誤:'TypeError:count不是函數'。 – Machtyn

+0

我已經使用您的建議在上面的問題中添加了更新。 – Machtyn

1

這裏是我如何解決它。

function getRow(index) { 
    var count = $$('li').count(); 

    var test = function(index, count) { 
     // Ensure a parameter has been passed. 
     if (index == undefined) { 
      throw Error("A parameter must be supplied for function getRow. Valid values are 0 through " + count-1); 
     } 
     // Ensure the parameter is within bounds 
     if (index < 0 || index >= count) { 
      throw Error("The parameter, " + index + ", is not within the bounds of 0 through " + count-1); 
     } 
    }); 

    count.then(function(count) { 
     test(index, count); 
    } 

    return $$('li').get(index); 
} 

我不知道爲什麼這個工程和我以前的嘗試沒有。那麼,除了我抽象的功能,並允許我自己以乾淨的方式通過索引。

+0

我可能做的是創建一個閉包。 (就像flaviomeira10建議的那樣)。 – Machtyn