teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

誤記

2019/03/06 12:00

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -164,22 +164,25 @@
164
164
 
165
165
  run(array)
166
166
  ```
167
- ここでArray.prototype.mapではなくfor文を使っていることに注意してください。先に述べたようにmapは「要素の実行が非同期関数の呼び出しかどうか」「非同期関数の呼び出しなら完了までまつ」なんて配慮を一切しない関数ですのでfor文を使ってかかねばならないのです。「for文書かないとだめなのかぁ」とげっそりするかも知れませんが、それするめには特別な非同期関数同期してくれるようなmapがなければなりません。そういうmap関数は今のところ標準のArrayにはないと思います。
167
+ ここでArray.prototype.mapではなくfor文を使っていることに注意してください。先に述べたようにmapは「要素の実行が非同期関数の呼び出しかどうか」「非同期関数の呼び出しなら完了までまつ」なんて配慮を一切しない関数ですのでfor文を使ってかかねばならないのです。「for文書かないとだめなのかぁ」とげっそりするかも知れませんが、map的な高階関数使いい場合、非同期関数同期的に適用してくれるような特別関数でなければなりません。そういうmap/forEach関数は今のところ標準のArrayにはないと思います。
168
168
 
169
169
  ```js
170
170
  ...
171
171
 
172
- Array.prototype.asyncMap = async function (op) {
172
+ Array.prototype.asyncForEach = async function (op) {
173
+ for (let i = 0; i < this.length; i++) {
173
- for (let i in this) {
174
+ if (i in this) {
174
- await op(this[i], i)
175
+ await op(this[i], i)
176
+ }
175
177
  }
176
178
  }
177
179
 
178
180
  async function run(array) {
179
- array.asyncMap(async funcion(ns) { await concurrentMain(ns) })
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

誤記、コードの間違い

2019/03/06 12:00

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

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(() => cmain(cur)),
123
+ (pre, cur) => () => pre().then(() => concurrentMain(cur)),
124
124
  () => Promise.resolve())
125
125
 
126
126
  cf()

1

日本語訂正

2019/03/06 11:09

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

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)