javascript
1window.onload = function() {
2
3 const fncs = Array.from(document.querySelectorAll('div'), item => () =>
4 new Promise(resolve => {
5 setTimeout(() => {
6 item.style.background = "red";
7 resolve();
8 }, 500);
9 })
10 );
11
12 (async () => {
13 for (const f of fncs) {
14 await f();
15 }
16 })();
17
18}
➡ サンプル
上のやつあかんわ。なんや難しく考えすぎとった。
上のやつ、一応ソレっぽく動くけど、なんや難しく考えすぎとったわ。
これでええやん:
javascript
1const sleep = (millisec) => new Promise(resolve => {
2 setTimeout(resolve, millisec);
3});
ゆうsleep作っておいてからの
javascript
1window.onload = async function() {
2
3 const items = Array.from(document.querySelectorAll('div'));
4
5 for (const item of items) {
6 await sleep(500);
7 item.style.background = "red";
8 }
9
10}
11
でええわいね ➡ サンプル
さらに上のコード詰めるとすると、 質問の前提としてはArray.from 使うんがお題ゆうことやけど、for ... of でループさせるもんを配列にしとかなあかんわけではないねんから、コレでええやろ思いますー
補足
質問者さんが知りたいのは、「(for (...of ... )使えばできるのは分かった。そやけど) Array.from
の第二引数として渡す関数、item => { ・・・・ }
の中で、divの背景を赤にする
javascript
1item.style.background = "red";
の直前で0.5秒待つゆう処理を入れてできへんの? 」ゆうことかもしれへんね。
それだとすると、一応、こないにすればできる。
html
1<!DOCTYPE html>
2<html lang="ja">
3<head>
4 <meta charset="UTF-8">
5 <title></title>
6 <script>
7
8 const sleepersGenerator = async function* (milliseconds) {
9 while (true) {
10 yield new Promise(resolve => { setTimeout(resolve, milliseconds); });
11 }
12 }
13
14 window.onload = function() {
15 const sleepers = sleepersGenerator(500);
16 Array.from(document.querySelectorAll('div'), async item => {
17 await sleepers.next();
18 item.style.background = "red";
19 })
20 }
21
22 </script>
23</head>
24<body>
25<div>1</div>
26<div>2</div>
27<div>3</div>
28<div>4</div>
29<div>5</div>
30<div>6</div>
31<div>7</div>
32<div>8</div>
33<div>9</div>
34<div>10</div>
35</body>
36</html>
上のコード、コピペしたHTMLファイル作ってブラウザに表示すれば期待されてる動きになっとる思いますう。(さきほど、一応ゆうたのは、sleepersGeneratorん中が、while(true)
になとって、sleepers
が終わらないイテレータになってしまうところが、ちょっとキモチワルイという点ですねん。)
そやけど、上のコードでも Array.from
使うんは「何か変」て感じや。なんでゆうたらArray.from
が返す配列を使ってないからのう。こういうときは、document.querySelectorAll('div') の返した要素のリストに対して、forEach使えばええ。
diff
1- Array.from(document.querySelectorAll('div'), async item => {
2+ document.querySelectorAll('div').forEach(async item => {