От ES2018 Async / ожидают ES2015 Обещания.... тайм-аут - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь преобразовать функцию ES2018 async в функцию ES2015 (ES6), но я получаю тайм-аут, думаю, что моя версия ES2015 неверна ... но где?

ES2018версия

    async function connectGoogleAPI () {
      // Create a new JWT client using the key file downloaded from the Google Developer Console
      const client = await google.auth.getClient({
        keyFile: path.join(__dirname, 'service-key.json'),
        scopes: 'https://www.googleapis.com/auth/drive.readonly'
      });

      // Obtain a new drive client, making sure you pass along the auth client
      const drive = google.drive({
        version: 'v2',
        auth: client
      });

      // Make an authorized request to list Drive files.
      const res = await drive.files.list();
      console.log(res.data);

      return res.data;
    }

Версия ES2015 с Promise

    function connectGoogleAPI () {
      return new Promise((resolve, reject) => {
        const authClient = google.auth.getClient({
          keyFile: path.join(__dirname, 'service-key.json'),
          scopes: 'https://www.googleapis.com/auth/drive.readonly'
        });
        google.drive({
          version: 'v2',
          auth: authClient
        }), (err, response) => {
          if(err) {
            reject(err);
          } else {
            resolve(response);
          }
        }
      });
    }

1 Ответ

0 голосов
/ 22 мая 2018

Вы не перевели await из getClient.Помните, await = then (примерно).Вы также становитесь жертвой анти-паттерна создания обещаний : когда у вас уже есть обещание (от getClient), вам почти никогда не нужно использовать new Promise.Просто используйте then.

Вот пример с каждым await, преобразованным в then, используя цепочку для последующих операций:

function connectGoogleAPI () {
  // Create a new JWT client using the key file downloaded from the Google Developer Console
  return google.auth.getClient({
    keyFile: path.join(__dirname, 'service-key.json'),
    scopes: 'https://www.googleapis.com/auth/drive.readonly'
  }).then(client => {
      // Obtain a new drive client, making sure you pass along the auth client
      const drive = google.drive({
        version: 'v2',
        auth: client
      });

      // Make an authorized request to list Drive files.
      return drive.files.list();
  }).then(res => {
      console.log(res.data);
      return res.data;
  });
}

Эта последняя часть может быть просто

  }).then(res => res.data);

... если вы удалите console.log.(Или мы можем злоупотреблять оператором запятой.)

Примечания:

  • Каждый await должен стать обработчиком then (в оригинале их было два, ожидающих * 1028)* и drive.files.list)
  • В обработчике then, если вам приходится ждать другого обещания (например, от drive.files.list), вы обычно возвращаете его из обработчика, а затем используйте другой обработчик для обработки этого результата (поэтому у меня есть return drive.files.list(), а затем отдельный обработчик для преобразования res в res.data)

Reвторой пункт: Иногда целесообразно вложение , например, когда вам нужно объединить результат с некоторым промежуточным значением, которое вы имеете только в обработчике then.(Например, если мы хотим объединить res.data с client.) Но, как правило, предпочитайте не вкладывать.

...