如何在等待承诺完成时执行代码
How to execute code while waiting for a promise to finish
我有一个快速应用程序,其中有一个需要 aprox 的生成器函数。处理大量数据需要 5 分钟。不幸的是我无法优化该功能。
自动表达 times out after 2 minutes 而我 而不是 只想针对此特定功能更改它。我想也许如果我定期拨打 res.write()
电话,则 2 分钟规则不适用。
我的问题:
如何在等待其他函数终止时每 X 秒执行一次 res.write('Something')
?
我希望它执行如下操作,希望你能理解。
function main() {
co(function* () {
const something = yield promise(); // function that needs a lot of time
const doWhileWaiting = setTimeout(() => {
if (!something) {
// Print this while waiting for the value of something
console.log('Waiting for something ... ');
} else {
console.log(something);
clearInterval(doWhileWaiting);
}
}, 5000);
});
}
你的 api 本身不应该有这么重的阻塞功能。更好的办法是让另一个进程为您处理这种计算,因为节点是单线程的,这将阻止所有其他计算。通过在您的计算函数中添加超时,肯定有一些方法 thread/process 可以做到这一点,但这不是很好的风格。因为我不知道你的功能是做什么的,所以很难给出一个可靠的答案,你的情况最好。
正如你所说的它每天执行一次,你可以做一个 cronjob 触发另一个进程。如果您需要与 api 进程通信,您可能需要查看子进程。 https://nodejs.org/api/child_process.html
这不是很难实现:
const secret = Symbol();
const delay = ms => new Promise(r => setTimeout(() => r(secret), ms));
async waitFor(promise) {
while(true) {
const racer = await Promise.race(promise, delay(1));
if(racer !== secret) return; // our promise won!
await delay(100);
}
}
此时,您希望在 运行 尚未完成时添加一个操作。
async waitFor(promise, action) {
while(true) {
const racer = await Promise.race(promise, delay(1));
if(racer !== secret) return; // our promise won!
await action(); // support passing a promise action.
await delay(100);
}
}
// will write to `res` every 100 ms while `yourPromise is not resolved.
waitFor(yourPromise, () => res.write("..."));
请注意,从根本上说,您应该将额外的工作放在一个工作队列中,并使用一个单独的进程来处理它。 Node 确实不适合这种工作量。我建议查看替代方案的其他答案。
我有一个快速应用程序,其中有一个需要 aprox 的生成器函数。处理大量数据需要 5 分钟。不幸的是我无法优化该功能。
自动表达 times out after 2 minutes 而我 而不是 只想针对此特定功能更改它。我想也许如果我定期拨打 res.write()
电话,则 2 分钟规则不适用。
我的问题:
如何在等待其他函数终止时每 X 秒执行一次 res.write('Something')
?
我希望它执行如下操作,希望你能理解。
function main() {
co(function* () {
const something = yield promise(); // function that needs a lot of time
const doWhileWaiting = setTimeout(() => {
if (!something) {
// Print this while waiting for the value of something
console.log('Waiting for something ... ');
} else {
console.log(something);
clearInterval(doWhileWaiting);
}
}, 5000);
});
}
你的 api 本身不应该有这么重的阻塞功能。更好的办法是让另一个进程为您处理这种计算,因为节点是单线程的,这将阻止所有其他计算。通过在您的计算函数中添加超时,肯定有一些方法 thread/process 可以做到这一点,但这不是很好的风格。因为我不知道你的功能是做什么的,所以很难给出一个可靠的答案,你的情况最好。
正如你所说的它每天执行一次,你可以做一个 cronjob 触发另一个进程。如果您需要与 api 进程通信,您可能需要查看子进程。 https://nodejs.org/api/child_process.html
这不是很难实现:
const secret = Symbol();
const delay = ms => new Promise(r => setTimeout(() => r(secret), ms));
async waitFor(promise) {
while(true) {
const racer = await Promise.race(promise, delay(1));
if(racer !== secret) return; // our promise won!
await delay(100);
}
}
此时,您希望在 运行 尚未完成时添加一个操作。
async waitFor(promise, action) {
while(true) {
const racer = await Promise.race(promise, delay(1));
if(racer !== secret) return; // our promise won!
await action(); // support passing a promise action.
await delay(100);
}
}
// will write to `res` every 100 ms while `yourPromise is not resolved.
waitFor(yourPromise, () => res.write("..."));
请注意,从根本上说,您应该将额外的工作放在一个工作队列中,并使用一个单独的进程来处理它。 Node 确实不适合这种工作量。我建议查看替代方案的其他答案。