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();
A callback function can return a value, in other words, but the code that calls the function won't pay attention to the return value. Yes, it makes fun sense to try and return a value from a promise callback.
The function to which the callback is passed is often referred to as a higher-order function. Conversely, Higher-Order Functions operate on other functions by either taking them as arguments or by returning them.
GAPI is Google's client library for browser-side JavaScript. It's used in Google Sign-in, Google Drive, and thousands of internal and external web pages for easily connecting with Google APIs.
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With