Как вернуть значение в асинхронной функции обратного вызова JS - gapi - PullRequest
1 голос
/ 10 ноября 2019

Я использую api-клиент google в своем приложении. У меня есть функция с именем initialize, которая использует gapi.load для проверки подлинности моих учетных данных и загрузки API YouTube.

gapi.load принимает функцию обратного вызова, где I authenticate и loadYoutubeApi, асинхронно. Я хочу знать, когда я запускаю функцию initialize, когда эти асинхронные функции завершены. Есть ли способ вернуть мне значение в этой функции асинхронного обратного вызова, чтобы при вызове initialize я знал, что эти асинхронные задачи завершены? Спасибо!

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();

Ответы [ 2 ]

2 голосов
/ 12 ноября 2019

Оберните загрузку в Обещание, чтобы вы могли ожидать его, как и весь ваш код.

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
1 голос
/ 12 ноября 2019

Вы можете обернуть gapi.load часть в обещание, как это:

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