【发布时间】:2022-01-26 00:55:42
【问题描述】:
React 应用程序可以运行 node.js 函数,该函数可以批量准备数据并将信息发送到数据库。 这需要很多时间,我想添加从 react 应用程序中直接停止此功能的功能。
const getShopifyOrders = require('./shopify');
const getTrack = require('./tracking');
const Order = require('./model');
async function addOrdersToDB(limit) {
try {
// Get latest order from DB
let latestOrd = await Order.findOne().sort('-order_number');
do {
// Get Shopify Orders
let orders = await getShopifyOrders(
latestOrd ? latestOrd.order_id : 0,
limit
);
latestOrd = orders[0] ? orders[orders.length - 1] : undefined;
// Update array with tracking status
let fullArray = await getTrack(orders);
// Add to DB
let ins = await Order.insertMany(fullArray, { ordered: false });
console.log(`Added ${ins.length} entries`);
} while (latestOrd);
} catch (err) {
console.log(err);
}
}
module.exports = addOrdersToDB;
我尝试了很多东西来包含在这个函数中,包括:
-
while 循环:在函数外部添加变量 - 如果为“真” - 运行代码,如果不是 - 返回 - 它只是不起作用(变量已从使用 socket.IO 的反应中更改)
-
setTimeout(也称为 setInterval),从 react 触发 clearTimeout 函数:这在 setTimeout 中不起作用,而 setInterval 在异步函数中不起作用
之后:
- 制作了(实际上在 stackoverflow 上很喜欢)新函数来承诺 setTimeout 能够在异步函数中使用:
const setTimeout2 = (callback, ms) => {
return new Promise(
resolve =>
(to = setTimeout(() => {
callback();
resolve();
}, ms))
);
};
async function addOrdersToDB(limit) {
do {
await setTimeout2(async () => {
try {
// some code here
} catch (err) {
console.log(err);
}
}, 400);
} while (latestOrderExist);
}
function clearTO() {
setTimeout(() => {
console.log('clearTO');
clearTimeout(to);
}, 3000);
}
由于某种原因,这不会迭代。
有解决办法吗? 谢谢!
【问题讨论】:
-
您能否为您要解决的实际问题显示代码。在 nodejs 中没有通用的方法来停止异步操作。每种类型的异步操作都是不同的。例如,您可以通过调用
clearTimeout(timerid)来停止setTimeout(),但没有办法停止fs.readFile()。因此,这完全取决于异步操作,因此我们需要查看真正的代码以及您要解决的实际问题。 -
请用您的实际代码发布问题。由于一些未知的原因,人们认为编写伪代码并提出某种通用问题会更好。这几乎从来都不是为您的问题找到一个好的答案的最佳方法。对于初学者来说,只有当我们看到您的实际代码时,我们才能看到实际和真正的问题,此外,当我们看到您的真实代码时,有时我们可以为您提供比您甚至想问的更好的解决方案。此外,当您将其提炼为伪代码时,人们通常会遗漏问题的重要细节。
-
刚刚添加了 node.js 代码。谢谢!
-
在你的真实代码中,你试图从外部中止什么?您是否尝试在您的第一个代码块中中止
do/while循环? -
是的,我试图中止 do/while 循环。
标签: javascript node.js reactjs sockets socket.io