akano1
akano1

Reputation: 41684

Can not return from a function

I have a function that looks like following

export const checkForAvailableAgent = (topicId, serviceUrl, serviceId) => {
  const serviceInfo = new window.adiaLive.ServiceInfo({
    topicId: topicId, // set here the topicId which you want listen for
    OnError: e => {
      // react to error message (optional)
      console.log("error: ", e);
    },
    OnServiceStateChange: e => {
      if (e.ConnectedAdvisers > 0) {
        // there are advisers online for given topicId
        console.log("studio available");
        return true;
      } else {
        console.log("studio not available");
        return false;
      }
    }
  });
  serviceInfo.connect(serviceUrl, serviceId);
};

however the return statements don't return anything when I use the function in the following manner

useEffect(() => {
    const agent = checkForAvailableAgent(
      `sales_${i18n.language}`,
      "https://linktoserviceurl",
      "serviceid"
    );

    // console.log("studio available is: ", agent);
  }, []);

the console.log massages appear but the return statement is undefined.

any help would be appreciated.

Upvotes: 0

Views: 76

Answers (4)

Anup Singh
Anup Singh

Reputation: 1573

There are 2 possible reasons

  1. you are not returning anything from checkForAvailableAgent.

  2. After returning from the checkForAvailableAgent, it might be asynchronous function. You can use async & await.

Upvotes: 1

tolotra
tolotra

Reputation: 3270

A version with async/await and try/catch

export const checkForAvailableAgent = (topicId, serviceUrl, serviceId) => {
  return new Promise((resolve, reject) => {
    const serviceInfo = new window.adiaLive.ServiceInfo({
      topicId: topicId,
      OnError: reject,
      OnServiceStateChange: e => resolve(e.ConnectedAdvisers > 0)
    });
    serviceInfo.connect(serviceUrl, serviceId);
  })
};

useEffect(() => {
  (async () => {
    try {
      const isAvailable = await checkForAvailableAgent(
        `sales_${i18n.language}`,
        "https://linktoserviceurl",
        "serviceid"
      );

      // console.log("Result", isAvailable)
    } catch(e) {
      console.error(e)
    }
  })()
    // console.log("studio available is: ", agent);
  }, []);

Upvotes: 1

MauriceNino
MauriceNino

Reputation: 6757

You can not return from a callback function, as it is running asynchronously and you are not waiting for it to have a result ready.

You can however make the function itself async by returning a Promise instead of the actual result and wait until the Promise has a result ready (e.g. it is resolved):

export const checkForAvailableAgent = (topicId, serviceUrl, serviceId) => {
    return new Promise((resolve, reject) => {
        const serviceInfo = new window.adiaLive.ServiceInfo({
          topicId: topicId, // set here the topicId which you want listen for
          OnError: e => {
            // react to error message (optional)
            console.log("error: ", e);

            reject(); // reject on failure
          },
          OnServiceStateChange: e => {
            if (e.ConnectedAdvisers > 0) {
              // there are advisers online for given topicId
              console.log("studio available");
              resolve(true); // resolve instead of return
            } else {
              console.log("studio not available");
              resolve(false);
            }
          }
        });
        serviceInfo.connect(serviceUrl, serviceId);
    }) 
};

useEffect(() => {
    checkForAvailableAgent(
      `sales_${i18n.language}`,
      "https://linktoserviceurl",
      "serviceid"
    ).then((agent) => { // then callback is called when the promise resolved
        console.log("studio available is: ", agent);
    }).catch(error => { // catch is called when promise got rejected
        console.log('An error happened');
    });

  }, []);

Upvotes: 2

TamirNahum
TamirNahum

Reputation: 484

The function servceInfo.OnServiceStateChange is a function into the object (seems to be an event).

I'd suggest declaring a variable on the checkForAvailableAgent like connected and change it's value when the event is called.

Then access it using checkForAvailableAgent.connected.

Upvotes: 1

Related Questions