8

I am using google's api client in my application. I have a function called initialize that uses gapi.load to authenticate my credentials and load the youtube api.

gapi.load takes a callback function which is where I authenticate and loadYoutubeApi, asynchronously. I want to know, when I run the initialize function, when these asynchronous functions have completed. Is there a way for me to return a value in this asynchronous callback function so that I know, when invoking initialize, that these asynchronous tasks have completed? Thanks!

const apiKey = 'my-api-key';
const clientId = 'my-client-id';

const authenticate = async () => {
  const { gapi } = window;
  try {
    await gapi.auth2.init({ clientId });
    console.log('authenticated');
  } catch (error) {
    throw Error(`Error authenticating gapi client: ${error}`);
  }
};

const loadYoutubeApi = async () => {
  const { gapi } = window;
  gapi.client.setApiKey(apiKey);
  try {
    await gapi.client.load('https://www.googleapis.com/discovery/v1/apis/youtube/v3/rest');
    console.log('youtube api loaded');
  } catch (error) {
    throw Error(`Error loading youtube gapi client: ${error}`);
  }
};

const initialize = async () => {
  const { gapi } = window;
  const isInitialized = await gapi.load('client:auth2', async () => {
    try {
      await authenticate();
      await loadYoutubeApi();
      return true;
    } catch (error) {
      throw Error(`Error initializing gapi client: ${error}`);
    }
  });
  console.log(isInitialized); // expects `true` but am getting `undefined`
};

initialize();
3
  • 2
    gapi.load doesn't return a Promise, so you can't usefully await it. Commented Nov 9, 2019 at 22:27
  • Ya, I didn't really think it did. How can I gain insight into knowing when the authenticate and loadYoutubeApi methods have completed? Commented Nov 9, 2019 at 22:30
  • 1
    Possible duplicate of How do I convert an existing callback API to promises?. Do not pass an async callback function. Make a promise for the load, await that in your initialize function. Commented Nov 12, 2019 at 15:41

2 Answers 2

10
+50

Wrap the load in a Promise so that you can await it like the rest of your code.

try {
  await new Promise((resolve,reject) => {
    gapi.load('client:auth2', resolve);
  });
  await authenticate();
  await loadYoutubeApi();
} catch (error) {
  throw Error(`Error initializing gapi client: ${error}`);
}
//is Initialized
Sign up to request clarification or add additional context in comments.

Comments

5

You can wrap gapi.load part in a promise like this:

const initialize = async () => {
  const { gapi } = window;
  await new Promise((resolve, reject) => {
    gapi.load('client:auth2', async () => {
      try {
        await authenticate();
        await loadYoutubeApi();
        resolve();
      } catch (error) {
        throw Error(`Error initializing gapi client: ${error}`);
      }
    });
  });
  return true;
};

initialize(); // returns 'true' when done.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.