2017-10-12 6 views
3

filterdList.lengthの値は、以下のコードを持つ要素の合計数と常に等しい。したがって、このメソッドは常にfalseを返します。指定された名前と一致するテーブル内のアイテムは1つだけです。async/awaitとpromise.allを使用して配列内の一致する要素を見つける

async itemExists(name) : Promise<boolean>{ 
const itemList = await element.all(this.itemList) 
const filterdList= await Promise.all(itemList.filter(async (item) =>{ 
    let text = await item.getText(); 
    if (text == name) { 
    return true; 
    } 
})); 

return await filterdList.length == 1; 
} 

この行は、間違ったのすべての種類である

console.log(await itemExists('unique item name')); 
+0

以内に一度だけ必要なのか? – guest271314

+0

このメソッドには、パラメータとしてnameが渡されます。 – Karthi

+0

'itemList'とは何ですか?私は 'filter'メソッドが約束返すコールバックを取るとは思わない。 – Bergi

答えて

3

awaitasync関数 `name`のが定義されて

async function itemExists(name) { 
    const itemList = await Promise.all(element.all(this.itemList) 
        .map(item => item.getText())); 
    const filterdList = itemList.filter(item => text === name); 
    return filterdList.length == 1; 
} 

itemsExists(name).then(bool => console.log(bool)); 

async function itemExists(name) { 
 
    const itemList = await Promise.all(['unique item name', 'not unique item name'].map(item => Promise.resolve(item))) 
 
    const filterdList = itemList.filter(item => item == name); 
 
    return filterdList.length === 1; 
 
} 
 

 
itemExists('unique item name').then(bool => console.log(bool));

+0

これをタイプスクリプトで実装する際に、次のエラーが発生します。どんな手掛かり ? '[ts] 'Promise <{}[]>'型の引数は 'Iterable <{} |'型のパラメータに代入できません。 PromiseLike <{}>> | PromiseLike >> '。 '@ゲスト271314 – Galileo123

+0

は' const itemExists = async(elementAll:ElementArrayFinder、name:string)=> { const fn = await elementAll.map((elm:ElementFinder)=> {return elmをソートしました。 getText()}); const itemList = PromiseBB.all(fn)を待機します。 const filterdList = itemList.filter(item => item === name); return filterdList.length == 1; } ' – Galileo123

+0

"非同期関数内でAwaitが1回だけ必要です " これはそのケースですが、一般的ではありません。あなたが別の約束を待っているなら、それを待たなければなりません。 – phillyslick

2

以下のようにこのメソッドを呼び出す:あなたはPromise、ないboolean返すようにしたいようreturn await filterdList.length == 1;

まず、それが見えます。あなたの目標であれば、その文でawaitキーワードを使用しないでください。第二に、awaitbooleanにすることはできません。 Promiseインスタンスでのみawaitを使用できます。代わりに、var list = await filterdListのようなことをすることができますし、後でlistの長さを確認することができます。

この方法を最初から再構築し、道に沿って console.log文でテストすることをお勧めします。それは、あなたが何がうまくいかないのか、どこでどこが悪いのかをよりよく理解することができます。 Promise.allに渡すものについては特に注意してください。それが約束の配列でなければ、それは正しく動作しません。

おそらく、すべての約束が解決されるまで、配列をフィルタリングしないでください。すべての名前を取得してからフィルタリングすることができます。下の行に解決された項目名が出力されます。これをフィルタリングすることができます。

var itemNames = await Promise.all(itemList.map(item => item.getName())) 
itemNames.filter(...).length 
関連する問題