Javascript 如何在等待承诺完成时执行代码

Javascript 如何在等待承诺完成时执行代码,javascript,node.js,express,promise,co,Javascript,Node.js,Express,Promise,Co,我有一个express应用程序,其中我有一个需要aprox的生成器函数。5分钟处理大量数据。不幸的是,我无法优化该函数 Express自动执行,我不想只为这个特定功能更改它。我想如果我周期性地调用res.write(),2分钟规则就不适用了 我的问题: 在等待其他函数终止时,如何每隔X秒执行一次res.write('Something') 我希望它能做如下的事情,我希望你能理解 function main() { co(function* () { const



我有一个express应用程序,其中我有一个需要aprox的生成器函数。5分钟处理大量数据。不幸的是,我无法优化该函数
Express自动执行,我不想只为这个特定功能更改它。我想如果我周期性地调用
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本身中有这么重的阻塞函数。最好让另一个进程为您处理这种计算,因为节点是单线程的,这将阻止所有其他计算。通过在计算函数中添加超时,确实可以在一个线程/进程中实现这一点,但这不是很好的风格。因为我不知道你的函数在做什么,所以很难给出一个可靠的答案,在你的情况下什么是最好的


正如您所说,它每天执行一次,您可以执行cronjob来触发另一个进程。如果需要与api进程通信,可能需要查看子进程

这并不难实现:

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实际上不适合这种工作负载。我建议您查看其他答案,寻找替代方案。

类似的答案?是否要让用户等待整整五分钟?您可以发送类似“谢谢,您的数据将在五分钟内准备就绪”的响应,并通过webhook、web套接字、推送通知等提供通知,或者只给他们一个链接,让他们在准备就绪时可以检查。对于应用程序,最终服务器将每天执行一次调用此函数的脚本。问题是,由于收益率,在´´´´´某物´´´´之后的所有内容在完成之前都不会执行。有没有办法在后台执行它,并在完成后收到通知?我认为您需要子进程…您所说的“服务器将每天执行一次脚本”到底是什么意思?您的意思是另一台服务器向您的端点发出HTTP请求吗?否则我看不出express与此有什么关系。