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

回答編集履歴

1

修正&追記

2018/11/28 03:15

投稿

karamarimo
karamarimo

スコア2555

answer CHANGED
@@ -1,28 +1,28 @@
1
1
  まずJavaScriptの非同期処理とイベントループについて調べて理解されることをおすすめします。
2
2
 
3
- 非同期に呼び出される関数は、少なくとも現在のコールスタックが空になるまで呼び出されることはありません。今の場合、`T.get()`のコールバック(`(err, data, response) => {...}`の部分)は3回設定されるわけですが、これらは少なくとも`for`文が終わったあと、任意の順番で実行されます。
3
+ 非同期に呼び出される関数は、少なくとも現在のコールスタックが空になるまで呼び出されることはありません。今の場合、`T.get()`のコールバック(`(err, data, response) => {...}`の部分)は3回設定されるわけですが、これらは少なくとも`for`文が終わったあと、任意の順番で実行されます。検索結果が3回とも同じになるのも、`for`文内で`lastId`は`''`のままなので`params`の更新ができていないことが原因です。
4
4
 
5
5
  追記のコードでは、`resolve`する場所が間違っています。コールバックが呼び出された時点で完了したとみなしたいので、コールバックの中で`resolve`しないと意味がありません。
6
6
 
7
7
  ですが、[twit](https://www.npmjs.com/package/twit)のUsageを見る限り Promise をサポートしているので自分でPromiseを作る必要がそもそもありません。
8
8
 
9
- > 検索結果(3回とも同じ結果)が出てきます。
9
+ テストしないですが、以下のコードのようにでると思います。
10
10
 
11
- これは別の原因です。
12
-
13
11
  ```js
14
- let params = {
12
+ !(async () => {
15
- q: '#ハッシュタグ since:2018-11-28_00:00:00_JST until:2018-11-28_00:30:00_JST',
13
+ for (let i = 0; i < 3; i++) {
16
- count: 3,
17
- max_id: lastId,
14
+ params.max_id = lastId
18
- result_type: 'recent',
15
+ const result = await T.get('search/tweets', params)
16
+ result.data.statuses.forEach(function (val, index, ar) {
17
+ console.log(index);
18
+ console.log('@' + val.user.screen_name);
19
- include_entities: false
19
+ console.log(val.text);
20
+ lastId = val.id.str
21
+ })
20
- }
22
+ }
23
+ })()
21
24
  ```
22
- と`params`はなっているので、`max_id` property の値はこの時点での`lastId`の評価された値`''`になります。このあと`lastId`の値を変えても意味はありません。
23
25
 
24
- そのため、`params`の値を自分で変えるなどする必要があります。
25
-
26
26
  ---
27
27
 
28
28
  イベントループの分かりやすい動画(英語)