I have this strange problem with sequential code, maybe I am missing something fundamental, but I cannot see what. The following backend code (async WebMethod) runs sequentially fine (I am not interested in asynchronous performance; simplest code is better):
let branch_url = await get_branches_func(token_id);
console.log("BRANCH_URL: ", branch_url);
var xml_branch = await get_branch_func(token_id, branch_url);
console.log("xml_branch: ", xml_branch);
branch_url and xml_branch are correctly returned and I can go ahead.
But if I run some other code after this:
. . .
var xml_branch = await get_branch_func(token_id, branch_url);
console.log("xml_branch: ", xml_branch);
var property_array = await process_properties_func(xml_branch, token_id, branch_url);
return("pippo"); // Return to frontend.
The function get_branch_func returns without executing the first .then() and process_properties_func is not even called.
This is the code of the two functions:
//------------------
// GET_BRANCH_FUNC: Get Property List
//------------------
export const get_branch_func = webMethod(Permissions.Anyone, (token, branch_url) =>
{
const datafeedid = 'lugushomesapi';
console.log("Hello world get_branch_func!");
var base64File = encode(token, 'base64');
const AuthHeader = "Basic "+base64File;
console.log("AuthHeader", AuthHeader);
return fetch(branch_url+"/property", {
'method': 'get',
'headers': {
'Authorization': AuthHeader
},
})
.then((httpResponse) => { // This part is never executed
//console.log("Response: ");
//console.log("Response: ", httpResponse);
if (httpResponse.ok) {
//return httpResponse.json();
console.log("Response OK: ", httpResponse);
return (httpResponse.text()); // RETURNS FROM INTERNAL THEN FUNCTION
} else
console.log("Fetch did not succeed: ", httpResponse);
console.log("Status:", httpResponse.status);
return (httpResponse.text()); // RETURNS FROM INTERNAL THEN FUNCTION
}
})
.then(xmlText => {
// Now you can work with the parsed XML document
console.log("xmlDoc:", xmlText);
return(xmlText);
});
}
);
//------------------
// PROCESS PROPERTIES: Get Properties, process and set Collection
//------------------
export const process_properties_func = webMethod(Permissions.Anyone, (xmlText, token, branch_url) =>
{
console.log("Hello world process_properties_func!");
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(xmlText,"application/xml");
// return([]); -> If I uncomment this, get_branch_func works fine
// Retrieve all property elements
const properties = xmlDoc.getElementsByTagName("property");
console.log("process_properties_func properties:", properties);
// return([]); -> If I uncomment this, in get_branch_func we have the same problem
// Create an array to store the results
var propertyArray = Array.from(properties).map(property => {
const propId = property.getElementsByTagName("prop_id")[0].textContent;
const lastChanged = property.getElementsByTagName("lastchanged")[0].textContent;
return {
prop_id: propId,
lastchanged: lastChanged
};
});
console.log("process_properties_func propertyArray: ", propertyArray);
return(propertyArray);
});
I tried to disable code in process_properties_func, it seems that if I leave more code it would fail, it works until only two lines are executed (i.e. if process_properties_func is only two instructions, get_branch_func is executed correctly.
I tried the following code but the result is the same:
get_branch_func(token_id, branch_url).then(async (result) => {
let xml_branch = result;
console.log("xml_branch: ", xml_branch);
var property_array = await process_properties_func(xml_branch, token_id, branch_url);
console.log("property_array: ", property_array);
I cannot use process_properties_func.then() because it fails (.then() is not available for the returned data).
I found the culprit of the problem: it is in the: console.log("process_properties_func properties:", properties);
If I comment it, everything works fine. properties is a XMLDocument, if I try to log it, everything seems to freeze/return even killing previous logs.
It would be interesting to understand how to avoid/detect these weird behaviors, but that would be another conversation.