gpt4 book ai didi

javascript - 尝试使用 setTimeout 在某些 js/node 代码中阻止 sleep

转载 作者:行者123 更新时间:2023-12-03 03:27:58 26 4
gpt4 key购买 nike

鉴于我在命令行中使用 node fileName.js 运行的以下代码,它似乎运行了循环中的所有项目然后在最后 sleep ……有点像所有的事情都是并行运行的或者什么的。

我希望代码在 setTimeout 期间阻塞/暂停,而不是仅在 setTimeout 完成后运行该函数。或者,如果在此用例中 setTimeout 不正确,请使用其他方法。

const removeUsers = async () => {
const users = await db.getUsers(); // returns 32 users.

// Split the users up into an array, with 2 users in each 'slot'.
var arrays = [], size = 2;
while (users.length > 0) {
arrays.push(users.splice(0, size));
}

// Now, for each slot, delete the 2 users then pause for 1 sec.
arrays.forEach(a => {
console.log(++counter;);

// Delete 2x users.
a.forEach(async u => {
console.log('Deleting User: ' + u.id);
await 3rdPartyApi.deleteUser({id: u.id});
});

// Now pause for a second.
// Why? 3rd party api has a 2 hits/sec rate throttling.
setTimeout(function () { console.log('Sleeping for 1 sec'); }, 1000);
});
}

日志是这样的..

1.
Deleting User: 1
Deleting User: 2
2.
Deleting User: 3
Deleting User: 4
3.
...
(sleep for 1 sec)
(sleep for 1 sec)
(sleep for 1 sec)
...
end.

看看 sleep 感觉如何不会被阻塞......它只是触发一个 sleep 命令,然后在一秒钟后得到处理......

这才是我真正追求的......

1.
Deleting User: 1
Deleting User: 2
(sleep for 1 sec)
2.
Deleting User: 3
Deleting User: 4
(sleep for 1 sec).
3.
...
end.

最佳答案

这会调用一堆async函数。它们每个都返回一个 Promise(async 函数总是返回 Promise),并且这些 Promise 被丢弃,因为 Array#forEach 不会对其所在函数的返回值执行任何操作通过了。

a.forEach(async u => {
console.log('Deleting User: ' + u.id);
await 3rdPartyApi.deleteUser({id: u.id});
});

这会启动一个计时器,甚至不会尝试等待它。

setTimeout(function () { console.log('Sleeping for 1 sec'); }, 1000);

将计时器拆分为一个函数,该函数返回一个在适当的时间内解析的 promise (如果您使用的是 Bluebird,则可以使用 Promise.delay 获得):

const delay = ms =>
new Promise(resolve => {
setTimeout(resolve, ms);
});

并将所有内容保留在一个 async 函数中,这样您就不会放弃任何 promise :

function* chunk(array, size) {
for (let i = 0; i < array.length;) {
yield array.slice(i, i += size);
}
}

const removeUsers = async () => {
const users = await db.getUsers(); // returns 32 users.

for (const a of chunk(users, 2)) {
console.log(++counter);

// Delete 2x users.
for (const u of a) {
console.log('Deleting User: ' + u.id);
await ThirdPartyApi.deleteUser({id: u.id});
}

console.log('Sleeping for 1 sec');
await delay(1000);
}
};

关于javascript - 尝试使用 setTimeout 在某些 js/node 代码中阻止 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46232547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com