◆ 非同期関数対応で順番に実行してくれる forEach メソッド
◆ 基本は forEach だけど他の配列のコールバック関数受け取るメソッドも非同期関数対応版がほしくなる

普通の forEach で async メソッドを実行すると 2 つ目以降の要素に対する関数呼び出しが Promise の解決を待たずに実行されます

function sleep(ms){
return new Promise(resolve => setTimeout(resolve, ms))
}

async function fn(){
Array.of(1, 2, 3).forEach(async e => {
await sleep(1000)
console.log(e, Date.now())
})
console.log("fn-end", Date.now())
}

await fn()
console.log("end", Date.now())

このコードの実行結果はこうなります
fn-end 1511926284362
end 1511926284362
1 1511926285723
2 1511926285723
3 1511926285723

end が先に出力されて 1, 2, 3 は全部同じタイムスタンプです

ループの各処理で Promise 解決まで待機させるには 自分で for-of 文を書いて await するのが簡単ですが for-of 文より forEach のようなコールバックを取るメソッドで書きたいです
ということで await 機能付き forEach を作りました
中身は for-of してるだけです

Array.prototype.awaitForEach = async function(fn){
for(const [k, v] of Object.entries(this)){
await fn(v, k, this)
}
}

async function fn(){
await Array.of(1, 2, 3).awaitForEach(async e => {
await sleep(1000)
console.log(e, Date.now())
})
console.log("fn-end", Date.now())
}

await fn()
console.log("end", Date.now())
1 1511926452723
2 1511926454723
3 1511926456723
fn-end 1511926456723
end 1511926456723

1,2,3 のあとに end が出力されて予定通りです

sleep は 1s のはずなのになぜか 2s かかってますが Firefox で確認すると 1s だったので Chrome の問題の可能性が高いです

1 1511926766479
2 1511926767499
3 1511926768501
fn-end 1511926768502
end 1511926768502

他にも map や filter なども async 対応版はあったほうがいいと思いますが 全部対応ってけっこう大変です
組み込みのメソッドが追加されればいいのですけどねー