回答編集履歴
3
誤記
answer
CHANGED
@@ -164,22 +164,25 @@
|
|
164
164
|
|
165
165
|
run(array)
|
166
166
|
```
|
167
|
-
ここでArray.prototype.mapではなくfor文を使っていることに注意してください。先に述べたようにmapは「要素の実行が非同期関数の呼び出しかどうか」「非同期関数の呼び出しなら完了までまつ」なんて配慮を一切しない関数ですのでfor文を使ってかかねばならないのです。「for文書かないとだめなのかぁ」とげっそりするかも知れませんが、
|
167
|
+
ここでArray.prototype.mapではなくfor文を使っていることに注意してください。先に述べたようにmapは「要素の実行が非同期関数の呼び出しかどうか」「非同期関数の呼び出しなら完了までまつ」なんて配慮を一切しない関数ですのでfor文を使ってかかねばならないのです。「for文書かないとだめなのかぁ」とげっそりするかも知れませんが、map的な高階関数を使いたい場合、非同期関数を同期的に適用してくれるような特別な関数でなければなりません。そういうmap/forEach関数は今のところ標準のArrayにはないと思います。
|
168
168
|
|
169
169
|
```js
|
170
170
|
...
|
171
171
|
|
172
|
-
Array.prototype.
|
172
|
+
Array.prototype.asyncForEach = async function (op) {
|
173
|
+
for (let i = 0; i < this.length; i++) {
|
173
|
-
|
174
|
+
if (i in this) {
|
174
|
-
|
175
|
+
await op(this[i], i)
|
176
|
+
}
|
175
177
|
}
|
176
178
|
}
|
177
179
|
|
178
180
|
async function run(array) {
|
179
|
-
array.
|
181
|
+
array.asyncForEach(async funcion(ns) { await concurrentMain(ns) })
|
180
182
|
log('completed')
|
181
183
|
}
|
182
184
|
|
183
185
|
run(array)
|
184
186
|
```
|
185
|
-
無理やり書くならこんな感じになってしまうでしょう。
|
187
|
+
無理やり書くならこんな感じになってしまうでしょう。
|
188
|
+
追記: **スミマセン。最初の回答に書いたasyncMapはmapとは言えませんし定義も不適切でした**。単に繰り返しをするだけのものなので関数名をasyncForEachに変更し実装もそれなりにしました。なおオリジナルのforEachに比べ仕様を簡略化しています。)
|
2
誤記、コードの間違い
answer
CHANGED
@@ -95,7 +95,7 @@
|
|
95
95
|
`.then(() => concurrentMain([...]))`
|
96
96
|
としなければならない点に注意してください。thenの引数は前段の非同期処理が完了する以前に評価されますので直接concurrentMainを呼び出してしまうと意味がなくなります。thenには「非同期処理が完了したときに実行したい関数」を指定するようにしてください。
|
97
97
|
|
98
|
-
ご質問の最初の段階のthenチェーンの例はPromise.allの引数の実際の書き方を省略しているおつもりなのでしょうが、その書き方にこそ重要な前提知識があるわけで、そこは省略せずに書いて実際に動かしてから質問を発した方がよ
|
98
|
+
ご質問の最初の段階のthenチェーンの例はPromise.allの引数の実際の書き方を省略しているおつもりなのでしょうが、その書き方にこそ重要な前提知識があるわけで、そこは省略せずに書いて実際に動かしてから質問を発した方がよかったと思います。
|
99
99
|
|
100
100
|
```js
|
101
101
|
Promise.all([1,2,3])
|
@@ -120,7 +120,7 @@
|
|
120
120
|
array = divide(array, 3)
|
121
121
|
|
122
122
|
cf = array.reduce(
|
123
|
-
(pre, cur) => () => pre().then(() =>
|
123
|
+
(pre, cur) => () => pre().then(() => concurrentMain(cur)),
|
124
124
|
() => Promise.resolve())
|
125
125
|
|
126
126
|
cf()
|
1
日本語訂正
answer
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
配列のmapなどで処理を書く前にもっと注意深くご自分のコードを検証(例えば実際に動かして)してみるべきだと思います。
|
2
|
-
|
2
|
+
なおここでは「メッセージがいつ表示されたか」は重要な情報です。以下の例をまず動かしてみてください。
|
3
3
|
|
4
4
|
```js
|
5
5
|
const start = +new Date()
|
6
6
|
|
7
|
-
function log(...m) {
|
7
|
+
function log(...m) { // メッセージを時刻とともに表示するデバッグ用関数
|
8
8
|
let t = '' + (+new Date() - start)
|
9
9
|
t = '0'.repeat(Math.max(0, 6 - t.length)) + t
|
10
10
|
console.log(`${t}:`, ...m)
|