在for循环和finally块中睡觉

时间:2020-02-27 15:57:20

标签: javascript node.js

我目前有以下循环

for (const pk of likerpk)
{
     await likeMediaId(ig, pk.trim());

}

问题是我想每隔X秒调用一次likeMediaId,在完成整个likeMediaId之后,我想调用名为Y的函数。

我曾尝试在for循环中放入睡眠,但这无济于事,似乎它仍在并行执行likeMediaId,而我一直想一次执行1个likeMediaId

基本上我想要的流程是(假设数组中有3个项目)

likeMediaId()
sleep 60 seconds
likeMediaId()
sleep 60 seconds
likeMediaId()
sleep 60 seconds

call function Y

最优雅的方式是什么?

3 个答案:

答案 0 :(得分:0)

如果您愿意接受rxjs:

const likeMediaId$ = (pk) => from(likeMediaId(ig, pk.trim())); // observable from promise
from(likerpk).pipe( // observable stream from list items
  concatMap(item => of(item).pipe(delay(60000))) // wait 60 seconds
  switchMap(pk => likeMediatId$(pk)), // run the function
  finally(() => Y()) // at end, do this
).subscribe(
  result => console.log(result),
  error => console.log(error)
)
瓦纳去超级香草?为什么不尝试间隔?

let i = likerpk.length // counter
const clearInterval = setInterval(() => {
  i -= 1 // iterate
  await likeMediaId(likerPk[i]) // await (runs backwards)
  if (!i) { // out of items
    clearInterval() // clear
    Y() // run Y
  }
}, 60000) // every 60 seconds

答案 1 :(得分:0)

您可以使用一个小助手来完成它:

// a little utility
const delay = (delay) => new Promise(resolve => setTimeout(resolve, delay));

for (const pk of likerpk)
{
     await likeMediaId(ig, pk.trim());
     await delay(60000);
}

Y();

似乎它仍在并行执行likeMediaId

这是函数likeMediaId中的错误。这项工作似乎可以解决。这是所有迭代基本上可以在paralell中运行的唯一方法。

答案 2 :(得分:-1)

您可以使用超时来完成。也许它不是最优雅的,但应该可以正常工作。

var i=0;

async function cycle() {
    await likeMediaId(ig, likerpk[i].trim());
    i++;
    if (i < likerpk.length) {
        setTimeout(cycle, 1000);
    }
}

cycle();