我不确定这个问题是否可以实现。
我正在将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);
})
答案 0 :(得分:0)
在此功能中,我试图检查MySQL数据库中的新记录。如果我有新记录,那么我想将此新记录的操作推送到当前的Promise.all队列中。这可能吗?
不是,Promise.all
接受有限数量的承诺,并等待所有承诺完成。
如果不可能的话,如何继续执行该目标?
好吧,一个承诺只是一个价值-如果您对某件事有一个承诺,那么执行已经在其他地方开始了。您始终可以执行第二次.all
,但是如果同时添加记录会发生什么呢?
这样做很好:
Promise.all(allPromises).then(() => Promise.all(allPromises)).then(() => {
});
但是到那时,最好还是等待checkNewData
调用结束再调用Promise.all
,因为否则会引入checkAllData和Promise.all之间的竞争
promise是“一次性的”事情,如果要处理结果,请考虑使用异步迭代器(请注意,这需要节点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
}
})();