在节点中的promise.all运行时添加新函数

问题描述 投票:1回答:1

如果可以实施,我不确定这个问题。

我使用node.js与express.js和MySQL数据库。

我在MySQL数据库中有一些记录。这些记录正在继续更新。

因此,假设我从MySQL获取一些记录并使用Promise.all函数在demoFunction上开始对每条记录的操作,这是返回的promise。

在这个函数中,我试图检查MySQL数据库中的新记录。如果我有新记录,那么我想将这个新记录的操作推送到当前的Promise.all队列中。这可能吗?如果不可能,那么如何通过继续执行来实现这一目标?

所以,我的代码就像,

const demoFunction = (arg1, arg2) => {
    checkForNewData();

    return new Promise((resolve, reject) => {
        // Rest of my code is here for this function
        // This function will be take around 5 to 10 mins    
    });
};

const dataFromDatabase = "Here i'm getting some data into array of object from SQL database";

let allPromises = dataFromDatabase.map((obj) => demoFunction(obj.arg1, obj.arg1));

const checkForNewData = () => {
    const newDataFromDatabase = "Here i'm getting some new data into array of object from SQL database";

    for (let i = 0; i < newDataFromDatabase.length; i++) {
        allPromises.push(demoFunction(newDataFromDatabase[i].arg1, newDataFromDatabase[i].arg2));
    }
};

return Promise.all(allPromises)
    .then(() => {
        // response
    })
    .catch((e) => {
        console.log(e);
    })
asynchronous promise async-await synchronous
1个回答
0
投票

在这个函数中,我试图检查MySQL数据库中的新记录。如果我有新记录,那么我想将这个新记录的操作推送到当前的Promise.all队列中。这可能吗?

不,Promise.all采取有限和一定数量的承诺,并等待所有这些承诺完成。

如果不可能,那么如何通过继续执行来实现这一目标?

好吧,承诺只是一个价值 - 如果你对事物有承诺,那么执行已经在其他地方开始了。你总是可以执行第二个.all但是如果在此期间添加了记录会发生什么?

这样做很好:

Promise.all(allPromises).then(() => Promise.all(allPromises)).then(() => {

});

但是那时你最好只是等待checkNewData调用才能调用Promise.all,因为否则你会在checkAllData和Promise.all之间引入一场竞赛。


承诺是“一次性”的事情,如果要处理结果,请考虑使用异步迭代器(注意,这需要节点12):

async function* getRecordData() {
  for await(const item in getPromisesOfInitDataFromDatabase()) {
    yield item; // or process it
  }
  while(true) { // or how often you want
    for await(const item of getNewDastaFromDatabase()) {
      yield item; // or process it
    }
    await sleep(3000); // or some sleep timeout to not constantly poll
  }
} 

其他地方:

(async () => {
  for await(const item of getRecordData()) {
    // items are available here one by one, including new items in the database
  }
})();
© www.soinside.com 2019 - 2024. All rights reserved.