私は、古いRubyスクリプトをjavascriptを使用して移植しています。この関数をcronインスタンスとして設定すると、スケジュールどおりに実行されます。この関数はmysqlデータベースに問い合わせて、商品の在庫情報を取得し、取引パートナーのAPIにリクエストを送信して、自分のサイトの在庫を更新します。非同期/同期性の問題によるNodeJSループの問題
ノードa-synchronicityのため、私は問題にぶつかっています。リクエストごとに1000件のリクエストをチャンクする必要があり、10k個の製品を送信しています。問題は、毎回最後の1000個のアイテムを送信するだけです。 whileループ内にあるforループは、json要求ボディの作成が完了する前に前進しています。私はwhileループの中でsetTimeout関数を作成しようとしましたが、要求関数と変数を渡してオブジェクトを作成してオブジェクトを作成し、それを配列に入れてループを完了させましたが、同じ結果。各リクエストが正しいバッチのアイテムを取得できるように、それを処理する最良の方法は何か分かりません。また、リクエストの上限に達しないように1000アイテムの各リクエストの間に3分待つ必要があります。
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);
}
});
});
[mcve]に減らすことはできますか? (あなたは途中で問題を見つけるかもしれません。) –
私はコード例を更新しました。 –