2017-10-24 7 views
2

次のコードはうまくいきます。しかし、関数の途中のPromiseコード(コメントで示される)を非同期コードに変更し、forループをmap()に置き換えたいと思います。どうすればいい?プロミスコードを非同期コードに置き換えます。Forループwith JavaScript(map)(

+3

約束は非同期である...あなたはすでにのawait /非同期を使用しているので、それはあなたが変更したいということではありませんasync/await ...を使用するコード...私の人生のためにあなたが何をしたいかを推測することはできません –

+0

'elements [i] .getAttribute(" value ")。 !私はそれを 'elements'としています** DOM要素の配列ではありません –

+0

@JaromandaXコードはセレンコードですが、私はそれについて何も知らないのですが、実際には' elements'はWebAPIの 'Element'です。このメソッドがPromiseを返す場所はどこにもありませんが... – Kaiido

答えて

1

、私がお勧めしたい:

// Start promise code 
try { 
    for (let element of await driver.findElements(By.css('input'))){ 
    console.log(await element.getAttribute("value")); 
    } 
} catch (error) { 
    console.log(error); 
} 

これはループでletを使用して、async/awaitがうまく命令型プログラミングを取り戻し方法を示しています。

属性が順番にリストされている点が異なります(getAttributeタイミングに依存しています)。スピードが重要な場合は、次のように秩序を維持しながら、

は、並行して属性を取得:

let elements = await driver.findElements(By.css('input')); 
for (let val of await Promise.all(elements.map(e => e.getAttribute("value")))) { 
    console.log(val); 
} 
+0

CRiceとjibの両方が私の質問に正解をくれました。私は、私の複数のソリューションを与えるためのジブへの答えを与えているが、私はCRiceの答えをテストし、それもあまりにもうまくいくので、私はCRiceに親指を与えた。ありがとうございました! – irrational

2

私は、その約束しているコードの一部を機能的には異なるスタイルのコードに置き換えたいと思っていますか?もしそうなら、ここでそのコードがある(あいまい)二行に圧縮:

// Start promise code 
const elements = await driver.findElements(By.css('input')); 
await Promise.all(elements.map(ele => ele.getAttribute('value').then(console.log))).catch(console.log); 
// End promise code 

あなたが言及あなたが非同期で約束ベースのコードを交換したいこと/スタイルのコードを待ちます。私は非同期/待機が約束に基づいているので(それを避けているわけではないので)一般的にそれに対して(この場合、私はそれが役に立ったと思うが)注意が必要だ。約束を愛することを学び、本当にコードをきれいにする場合にのみasync/await構文を使用してください。あなたは、単にコンソールに情報をダンプしているので

関連する問題