Как связать несколько обещаний при передаче и обновлении объекта через каждое обещание с помощью дополнительных вызовов API? - PullRequest
0 голосов
/ 20 декабря 2018

Я новичок в Javascript и только знакомлюсь с обещаниями, так что прости мое невежество.

Что я пытаюсь сделать, это запросить все записи из базы Airtable и отфильтровать их на основе флажканазывается "Email Sent", будучи неотправленным.Когда у меня отфильтрованы записи, есть связанные записи в 2 полях, для которых мне нужно выполнить дополнительные запросы, чтобы получить значения.Все эти значения (различные данные и получатели в виде объекта) затем вставляются в шаблон электронной почты в формате HTML и запускаются с помощью AWS-SES.Затем для этих записей устанавливается флажок «Отправлено по электронной почте», чтобы сообщения электронной почты не отправлялись несколько раз.Планируется, что все это будет работать с интервалом в AWS Lambda.И когда записи добавляются в базу, они автоматически отправляются в список по электронной почте.

Я могу получить записи и отфильтровать их.Мне также удобно выполнять код в Lambda и использовать SES.Но я боролся в течение нескольких дней, чтобы получить значения для связанных записей.Оба из них являются списками людей, а 1 - адресом электронной почты получателя.

Множество вещей, которые я пробовал, заканчиваются тем, что либо возвращают исходную запись, вызванную на первом шаге, либо возвращают неопределенное.У меня много обещаний, и я не думаю, что делаю это правильно, потому что кажется, что они выходят из строя.Я также собираюсь попробовать странные вещи, такие как использование глобального массива вместо объекта, который я передаю через обещания и обновления.

Любая помощь приветствуется.Заранее спасибо.

var Airtable = require('airtable');
var base = new Airtable({apiKey: 'xxxxxxxxxx'}).base('xxxxxxxxxx');
var nodemailer = require("nodemailer")
var handlebars = require('handlebars');
const path = require('path');
var AWS = require("aws-sdk")
var ses = new AWS.SES();
var fs = require('fs');

var mainArray = [];

var readHTMLFile = function(path, callback) {
    fs.readFile(path, {encoding: 'utf-8'}, function (err, html) {
        if (err) {
            throw err;
            callback(err);
        }
        else {
            callback(null, html);
        }
    });
};

function getRecords(){
    return new Promise(function(resolve, reject) {
      var reqArr = [];

      base('Edit Requests').select({
          // Selecting the first 3 records in Grid view:
          maxRecords: 50,
          view: "Grid view"
      }).eachPage(function page(records, fetchNextPage) {
          // This function (`page`) will get called for each page of records.

          records.forEach(function(record) {
            // console.log("108: ", record._rawJson.id)
            var obj = {}
            // obj = record.fields;
            // obj.id = record._rawJson.id;
            console.log("172", record.fields["Editor Preference"])
            obj = record.fields;
            obj.id = record._rawJson.id;

            if(record.fields["Editor Preference"] != undefined){
              obj["Editor Preference"] = obj["Editor Preference"]
              // obj["Editor Preference"] = getEditorWrap(record.fields["Editor Preference"])
            } else {
              obj["Editor Preference"] = "";
            }

            if(record.fields["Production Manager"] != undefined){
              obj["Production Manager"] = obj["Production Manager"]
            } else {
              obj["Production Manager"] = "";
            }

            mainArray.push(obj)
            // console.log(record.fields["Email"])
              // console.log('Retrieved', record.fields['Requested By']);
        })
          // To fetch the next page of records, call `fetchNextPage`.
          // If there are more records, `page` will get called again.
          // If there are no more records, `done` will get called.
          fetchNextPage();
          // console.log("123", reqArr)
          // resolve(reqArr)
      }, function done(err) {
          if (err) { console.error(err); return; }
          // console.log("123", mainArray)
          resolve(mainArray)
      });
      // resolve(reqArr)
    });
}

function filterRecords(arr){
  return new Promise(function(resolve, reject) {
    var filtered = []
    mainArray = [];
    // console.log("245", arr)
    for (i in arr){
      if(arr[i]['Email Sent'] == undefined){
        // console.log("247", arr[i])
        mainArray.push(arr[i])

      };
    }
    console.log("filtered: ", mainArray)
    resolve(mainArray)
  });
}

function setObject(array){
  return new Promise(function(resolve, reject) {

    for (i in array){
      var obj = array[i];

      if(obj.id != undefined){

        base('Editors').find(obj.id, function(err, record) {
            if (err) { console.error(err); return; }
            // console.log("281", record.fields);

        });
      }

    }

    resolve(mainArray)
  });
}

function main1(){

  return new Promise(function(resolve, reject) {

    getRecords().
      then(function(recordArr){
        filterRecords(mainArray).
          then(function(resultArr){
            setObject(mainArray).
              then(function(mainArray){
              })

          })
      })


  });

}



main1().
  then(function(resultArray){
    console.log(resultArray)
  })
...