I know there are more questions like this on StackOverflow, but I read a few of them and they're all pretty specific and I can't work it out. So I'm sorry in advance for posting a "duplicate", but I really need help.
I made this program to upload data from a JSON file to the WooCommerce API, but when I run it like this it will crash because of the asynchronous code not keeping up with my for loop. How can I automate this, or make the for-loop synchronous? Is that even possible or it there another way? The loop I'm talking about is the one right at the end, uploadAllProducts.
This is the code:
// Import required modules
let fs = require("fs");
const WooCommerceRestApi = require("@woocommerce/woocommerce-rest-api").default;
// Connect to WooCommerce's API
const WooCommerce = new WooCommerceRestApi({
url: '====================',
consumerKey: "===================",
consumerSecret: "=====================",
version: 'wc/v3'
});
async function uploadProducts(page) {
// Choose a JSON file to import
let productsJSON = await JSON.parse(fs.readFileSync(`products${page}.json`));
console.log(`Imported page ${page}`);
// Iterate over all the products
productsJSON.forEach(async function(product) {
// If product is found
if (product) {
async function getCategory(a) {
switch (a) {
case "film":
return 202;
break;
case "cd vinyl":
return 163;
break;
case "boeken":
return 133;
break;
case "audiovideo":
return 125;
break;
case "baby":
return 130;
break;
case "computer":
return 190;
break;
case "kleding":
return 205;
break;
case "muziek":
return 208;
break;
case "verzamelen":
return 211;
break;
default:
return 15;
}
}
let cat = await getCategory(product.category);
async function getsubCategory(b) {
switch (b) {
case "dvd films":
return 203;
break;
case "geschiedenis":
return 138;
break;
case "religie":
return 140;
break;
case "thrillers":
return 141;
break;
case "flora fauna":
return 143;
break;
case "detectives":
return 144;
break;
case "dance house":
return 180;
break;
case "software spellen":
return 191;
break;
case "nintendo ds":
return 192;
break;
case "sony playstation":
return 193;
break;
case "nintendo wii":
return 198;
break;
default:
return 213;
}
}
let subcat = await getsubCategory(product.subcategory);
// Assign productinformation to WooCommerce product
const data = await {
name: product.title,
type: "simple",
regular_price: product.price.toString(),
description: "",
short_description: product.descr,
categories: [{
id: cat
},
{
id: subcat
}
],
images: [{
src: product.imgUrl
}]
};
console.log("Assigned all product information");
// Add product to WooCommerce
WooCommerce.post("products", data)
.then((response) => {
console.log("Product uploaded");
})
.catch((error) => {
console.log(error.response.data);
});
}
});
}
uploadAllProducts(firstPage, lastPage) {
for (let i = firstPage; i < lastPage + 1; i++) {
uploadProducts(i);
}
}