Асинхронная запись данных в GCS внутри обещания - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь найти способ записать данные json в файл в корзине Google Cloud Storage внутри обещания.

Я обнаружил, что если я попробую и .pu sh () значения в массиве одно за другим, а затем верну его, он даст мне только первые 3 результата из массива (тогда как console.log вернет все. *

Итак, по сути, мой вопрос: есть ли способ написать обещание или подобное, которое будет ждать, пока будут собраны все зацикленные значения, и как только это будет сделано, вернуть эти значения в функцию, которая затем загрузит их все в GCS?

Или есть способ, которым я могу записать эти значения в файл. json в GCS асинхронно, одновременно с очисткой данных?

const urls = [/* 20+ URLs go here... */];
let promises = [];

// Build array of Promises
urls.map(function(url) {
  promises.push(axios.get(url));
});

// Map through the array of promises and get the response results
axios.all(promises).then((results) => {
  results.map((res) => {
    try {
      // Scrape the data
      const $ = new JSDOM(res.data);
      const data = {};

      data.title = ($.window.document.querySelector('head > title') !== null ? $.window.document.querySelector('head > title').text : '');
      data.description = ($.window.document.querySelector("meta[name='description']") !== null ? $.window.document.querySelector('meta[name="description"]').content : '');
      data.robots = ($.window.document.querySelector("meta[name='robots']") !== null ? $.window.document.querySelector("meta[name='robots']").content : '');

      const value = JSON.stringify(data) + '\n';

      // Tried array.push(value) here but doesn't return all the values?
      // Any way to return all the values and then bulk upload them to GCS outside of this code block?
      const file = storage.bucket(bucketName).file(filename);
      file.save(value, function(err) {
        if (!err) {
          // file written
        }
      })

    } catch(e) {
      console.log(e);
    }
  })
})

Извините за плохое объяснение, по сути, я не могу поместить sh все значения в массив, а затем загрузить их, и если я попытаюсь загрузить значения по одному, я получаю только последние v alue в циклическом массиве.

Примечание: Я не пытаюсь сохранить данные в файл. json локально с помощью fs.writeFile (), а затем загрузить в GCS, но отправить данные JSON напрямую в GCS без промежуточных шагов.

1 Ответ

3 голосов
/ 25 мая 2020

если я правильно понял, что вам нужно, должно работать

axios.all(promises).then((results) => {
  const uploads = results.map((res) => {
    try {
      // Scrape the data
      const $ = new JSDOM(res.data);
      const data = {};

      data.title = ($.window.document.querySelector('head > title') !== null ? $.window.document.querySelector('head > title').text : '');
      data.description = ($.window.document.querySelector("meta[name='description']") !== null ? $.window.document.querySelector('meta[name="description"]').content : '');
      data.robots = ($.window.document.querySelector("meta[name='robots']") !== null ? $.window.document.querySelector("meta[name='robots']").content : '');

      const value = JSON.stringify(data) + '\n';

      return new Promise((resolve, reject) => {
       const file = storage.bucket(bucketName).file(filename);
       file.save(value, function(err) {
         if (!err) {
           resolve()
         }
         reject()
       })
      });


    } catch(e) {
      console.log(e);
    }
  })
  return Promise.all(uploads);
})
...