确保循环等待直到移动到JavaScript中的下一个项目

时间:2018-03-21 14:26:42

标签: javascript node.js loops async-await

首先,我很欣赏有很多解释这个主题的答案,但我目前无法理解。

我想遍历我创建的JavaScript对象,然后执行各种操作,例如向API发出请求,然后在Redis中存储一些数据。

这是我到目前为止所拥有的

const params = { "handle1": { "screen_name": "handle1", "hash_tag": "#hashtag1"},
             "handle2": { "screen_name": "handle2", "hash_tag": "#hashtag2"} }

for (const k of Object.keys(params)) {
  console.log("Searching for " + params[k]['screen_name'])

  client.get('statuses/user_timeline', { screen_name: params[k]['screen_name']})
  .then(function (tweets) {

    for (const key of Object.keys(tweets)) {
      const val = tweets[key]['text'];

      if(val.includes(params[k]['hash_tag'])) {
        console.log("Found")
        r_client.hset(params[k]['screen_name'], 'tweet_id', tweets[key]['id'], 'tweet_text', tweets[key]['text'], function (err, res) {
          console.log(res)
        });
        r_client.hgetall(params[k]['screen_name'], function(err, object) {
          console.log(object);
        });
     }
   }
   r_client.quit();
  })
  .catch(function (error) {
    throw error;
  });
}

当我运行它时,输出如下

Searching for handle1
Searching for handle2
Found
0
{ tweet_id: '123456789',
  tweet_text: 'text found in tweet' }
Found
undefined
undefined

所以我马上就遇到了一个问题,即第一个循环没有完成事件并且它被移动到第二个循环上。

我想按顺序运行它(如果这是最好的方式),但更重要的是我希望有人可以分解我的代码并解释我应该如何接近它以使其正常运行。

2 个答案:

答案 0 :(得分:0)

const tweets = await client.get(...)应该做到这一点。

答案 1 :(得分:0)

values_count=2.get().hset()返回Promises的情况下,这应暂停执行,直到所有函数都已解决:



hgetall()