0

我是 Javascript 新手,刚刚熟悉 Promise,所以请原谅我的无知。

我正在尝试做的是从 Airtable 库请求所有记录,并根据未发送的名为“已发送电子邮件”的复选框过滤它们。当我过滤记录时,有 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)
  })

4

0 回答 0