javascriptvelo

Sequential execution in backend Wix Velo Javascript


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).


Solution

  • 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.