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 回圈:在函式外部添加變數 - 如果為“true” - 運行代碼,如果不是 - 回傳 - 它不起作用(變數已從使用 socket.IO 的 react 更改)
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);
}
由于某種原因,這不會迭代。
有解決方案嗎?謝謝!
uj5u.com熱心網友回復:
要中止do/while回圈,您需要向該回圈添加一個額外的測驗,該測驗是一些可以從外部世界修改的變數。另請注意,附加測驗僅在此處有效,因為您在await回圈內使用。如果await回圈內部沒有,那么回圈將是完全同步的,并且在回圈運行時將無法從回圈外部更改變數(因為 nodejs 的單執行緒性)。
由于這是一個服務器(并且全域變數通常很糟糕),我假設我們不應該使用全域變數。因此,相反,我將重組addOrdersToDB()以回傳一個資料結構,其中包含現有版本回傳的承諾和abort()呼叫者可以呼叫以停止當前處理的函式。這也允許addOrdersToDB()運行多個單獨的呼叫,每個呼叫都有自己單獨的abort()方法。
function addOrdersToDB(limit) {
let stop = false;
function abort() {
stop = true;
}
async function run() {
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 (!stop && latestOrd);
// make resolved value be a boolean that indicates
// whether processing was stopped with more work still pending
return !!(latestOrd && stop);
} catch (err) {
// log error and rethrow so caller gets error propagation
console.log(err);
throw err;
}
}
return {
promise: run(),
abort: abort
}
}
所以,要使用它,你必須改變你呼叫的方式addOrdersToDB()(因為它不再只回傳一個承諾)并且你必須捕獲abort()它回傳的函式。然后,代碼的其他部分可以呼叫該abort()函式,然后它會翻轉內部stop變數,這將導致您的do/while回圈停止任何進一步的迭代。
請注意,這不會停止do/while回圈當前迭代內的異步處理- 它只會停止回圈的任何進一步迭代。
請注意,我還更改了您的catch塊,以便它重新引發錯誤,以便呼叫者查看是否/何時出現錯誤。
而且,函式的決議值是內部stop變數,因此呼叫者可以查看回圈是否中止。一個true決議值意味著回圈中止,還有更多的作業要做。
這是該函式的一個附加版本,它創造了更多機會讓它await在函式內和回圈內的操作之間停止。這仍然不會中止可能正在進行的單個資料庫操作 - 您必須檢查您的資料庫是否支持這樣的操作,如果支持,如何使用它。
function addOrdersToDB(limit) {
let stop = false;
function abort() {
stop = true;
}
async function run() {
try {
// Get latest order from DB
let latestOrd = await Order.findOne().sort('-order_number');
if (!stop) {
do {
// Get Shopify Orders
let orders = await getShopifyOrders(
latestOrd ? latestOrd.order_id : 0,
limit
);
latestOrd = orders[0] ? orders[orders.length - 1] : undefined;
if (stop) break;
// Update array with tracking status
let fullArray = await getTrack(orders);
if (stop) break;
// Add to DB
let ins = await Order.insertMany(fullArray, { ordered: false });
console.log(`Added ${ins.length} entries`);
} while (!stop && latestOrd);
}
// make resolved value be a boolean that indicates
// whether processing was stopped with more work still pending
return !!(latestOrd && stop);
} catch (err) {
// log and rethrow error so error gets propagated back to cller
console.log(err);
throw err;
}
}
return {
promise: run(),
abort: abort
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/394237.html
標籤:javascript 节点.js 反应 插座 socket.io
下一篇:C#套接字-如何正確處理行尾
