我目前有以下循环
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
最优雅的方式是什么?
答案 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();