Ich portiere ein altes Ruby-Skript, um Javascript zu verwenden, indem ich die Funktion als Cron-Instanz setze, damit es nach Plan läuft. Die Funktion fragt unsere MySQL-Datenbank ab, ruft Inventarinformationen für unsere Produkte ab und sendet dann Anfragen an einen Handelspartner, um unser Inventar auf der Site zu aktualisieren.NodeJS Loop-Problem aufgrund von Async-/Synchronicity-Problemen
Aufgrund der a-Synchronität der Knoten stoße ich auf Probleme. Wir müssen Anfragen in 1000 Artikel pro Anfrage teilen, und wir senden 10k Produkte. Das Problem ist, dass jede Anfrage nur die letzten 1000 Elemente jedes Mal sendet. Die for-Schleife, die sich innerhalb der while-Schleife befindet, bewegt sich vorwärts, bevor sie den json-Anfragetext fertiggestellt hat. Ich habe versucht, anon setTimeout-Funktionen in der while-Schleife zu versuchen und zu behandeln, sowie ein Objekt mit der Anfrage-Funktion und die Variablen zu übergeben und stopfen es in ein Array zu iterieren, sobald die While-Schleife abgeschlossen ist, aber ich bekomme das gleiche Ergebnis. Nicht sicher, was der beste Weg ist, damit umzugehen, damit jeder Antrag den korrekten Stapel der Einzelteile erhält. Ich muss auch 3 Minuten zwischen jeder Anforderung von 1000 Elementen warten, um die Anforderungsobergrenze nicht zu treffen.
query.on('end',()=>{
connection.release();
writeArray = itemArray.slice(0),
alteredArray = [];
var csv = json2csv({data: writeArray,fields:fields}),
timestamp = new Date(Date.now());
timestamp = timestamp.getFullYear() + '-' +(timestamp.getMonth() + 1) + '-' + timestamp.getDate()+ ' '+timestamp.getHours() +':'+timestamp.getMinutes()+':'+timestamp.getSeconds();
let fpath = './public/assets/archives/opalEdiInventory-'+timestamp+'.csv';
while(itemArray.length > 0){
alteredArray = itemArray.splice(0,999);
for(let i = 0; i < alteredArray.length; i++){
jsonObjectArray.push({
sku: alteredArray[i]['sku'],
quantity: alteredArray[i]["quantity"],
overstockquantity: alteredArray[i]["osInv"],
warehouse: warehouse,
isdiscontinued: alteredArray[i]["disc"],
backorderdate: alteredArray[i]["etd"],
backorderavailability: alteredArray[i]["boq"]
});
}
var jsonObject = {
login: user,
password: password,
items: jsonObjectArray
};
postOptions.url = endpoint;
postOptions.body = JSON.stringify(jsonObject);
funcArray.push({func:function(postOptions){request(postOptions,(err,res,body)=>{if(err){console.error(err);throw err;}console.log(body);})},vars:postOptions});
jsonObjectArray.length = 0;
}
var mili = 180000;
for(let i = 0;i < funcArray.length; i++){
setTimeout(()=>{
var d = JSON.parse(funcArray[i]['vars'].body);
console.log(d);
console.log('request '+ i);
//funcArray[i]['func'](funcArray[i]['vars']);
}, mili * i);
}
});
});
Können Sie das auf einen [MCVE] reduzieren? (Sie können sogar das Problem auf dem Weg finden.) –
danke für die Klarstellung, ich habe das Codebeispiel aktualisiert. –