承诺功能在。

时间:2016-05-14 00:20:45

标签: javascript node.js sms promise aws-lambda

我要做的是运行将发送消息的函数。节点js的问题在于它不会按顺序返回。但我希望每个函数都按照编码的顺序运行。

不确定我在这里失踪了什么。

现在我可以让它按顺序返回消息1和消息2但是我想从callfirstmessage一直到callfifthmessage。当我试图这样做时,他们都会无序返回。



var promise = new Promises(function(resolve, reject) {
  // do some async stuff
  callfirstmessage();
  //resolve(data);
  if (success) {
    resolve(data);
  } else {
    reject(reason);
  }
});
promise.then(function(data) {
  // function called when first promise returned
  return new Promises(function(resolve, reject) {
    // second async stuff
    callthirdmessage();
    //resolve(data);
    if (success) {
      resolve(data);
    } else {
      reject(reason);
    }
  });
}, function(reason) {
  // error handler
}).then(function(data) {
  callsecondmessage();

}, function(reason) {
  // second error handler
});




我看了几个不同的帖子谈论这个话题,我已经使用了这些建议。我认为我的问题是无法成功地将这些链接在一起。我花了几天时间没有进一步的进展......我需要帮助不好!

-----------------------编辑----------------------- -----

我想我需要应用类似的东西。然后我在这里找到:https://coderwall.com/p/ijy61g/promise-chains-with-node-js。但由于某种原因,它仍在随机发送消息。

也许,我只是朝着完全错误的方向前进。 :/

以下是我正在使用的所有内容



// dependencies
console.log("starting program");
var async = require('async');
var AWS = require('aws-sdk');
var Converter = require("csvtojson").Converter;
var util = require('util');
var Promises = require('pinkie-promise');
var vow = require('vow');

var s3 = new AWS.S3();

var snsTopicEMAIL = new AWS.SNS({
  params: {
    TopicArn: 'arn:aws:sns:xxxxxxxxxxxxxxxxxxxxxxxx'
  }
});
var snsTopicSMS = new AWS.SNS({
  params: {
    TopicArn: 'arn:aws:sns:xxxxxxxxxxxxxxxxxxxxxxxxx'
  }
});

var abort = false;

//SMS
function topDSRsms(csvJSON) {
  var ytdTopReg = "";

  if (csvJSON.length < 1) {
    console.error("Not enough data records in CSV to compose an SMS. Aborting. count:" + csvJSON.length);
    tdTopReg = "There was an error. Please contact IT for assistance.";
    abort = true;
    throw '';
  }

  ytdTopReg = "";
  for (var i = 0; i < csvJSON.length; i++) {
    var csvItem = csvJSON;
    if (csvItem[i].KPIvalue.length > 0 && csvItem[i].KPI.length > 0) {
      var KPI = " " + csvItem[i].KPI + ":" + csvItem[i].KPIvalue + "\n";
    } else {
      KPI = " ";
    }
    if (csvItem[i].TrendValue1.length > 0 && csvItem[i].Trend1.length > 0) {
      var trend1 = "\n" + svItem[i].Trend1 + ":" + csvItem[i].csvItem[i].TrendValue1;
    } else {
      trend1 = "";
    }
    if (csvItem[i].TrendValue2.length > 0 && csvItem[i].Trend2.length > 0) {
      var trend2 = "\n" + csvItem[i].Trend2 + ":" + csvItem[i].TrendValue2;
    } else {
      trend2 = "";
    }
    if (csvItem[i].TrendValue3.length > 0 && csvItem[i].Trend3.length > 0) {
      var trend3 = "\n" + csvItem[i].Trend3 + ":" + csvItem[i].TrendValue3;
    } else {
      trend3 = "";
    }
    ytdTopReg += "\n#" + (i + 1) + KPI + csvItem[i].RankTrend + ":" + csvItem[i].RankTrendValue + trend1 + trend2 + trend3;
  }
  return ytdTopReg;
}

function dshSmsStr(csvJSON) {
  return "DSR:" +
    topDSRsms(csvJSON);
}

//email
function topDSREmail(csvJSON) {
  var ytdTopReg = "";

  ytdTopReg = "Top orders By Region - ";
  for (var i = 0; i < csvJSON.length; i++) {

    if (csvJSON.length < 1) {
      console.error("Not enough data records in CSV to compose an email. Aborting.");
      ytdTopReg = "There was an error. Please contact IT for assistance."
      abort = true;
      throw '';
      //return -1;
    } else {
      var csvItem = csvJSON;
      if (csvItem[i].KPIvalue.length > 0 && csvItem[i].KPI.length > 0) {
        var KPI = " " + csvItem[i].KPI + ":" + csvItem[i].KPIvalue + "\n";
      } else {
        KPI = "";
      }
      if (csvItem[i].TrendValue1.length > 0 && csvItem[i].Trend1.length > 0) {
        var trend1 = "\n" + svItem[i].Trend1 + ":" + csvItem[i].csvItem[i].TrendValue1;
      } else {
        trend1 = "";
      }
      if (csvItem[i].TrendValue2.length > 0 && csvItem[i].Trend2.length > 0) {
        var trend2 = "\n" + csvItem[i].Trend2 + ":" + csvItem[i].TrendValue2;
      } else {
        trend2 = "";
      }
      if (csvItem[i].TrendValue3.length > 0 && csvItem[i].Trend3.length > 0) {
        var trend3 = "\n" + csvItem[i].Trend3 + ":" + csvItem[i].TrendValue3;
      } else {
        trend3 = "";
      }
      ytdTopReg += "\n#" + (i + 1) + KPI + csvItem[i].RankTrend + ":" + csvItem[i].RankTrendValue + trend1 + trend2 + trend3 + "\n";
    }
  }
  return ytdTopReg;
}

function dshEmailStr(csvJSON) {
  return "DSR:" +
    topDSREmail(csvJSON);
}
console.log("compiled totals string and customer string");
exports.handler = function(event, context) {
  // Read options from the event.
  console.log("Reading options from event:\n", util.inspect(event, {
    depth: 5
  }));
  var srcBucket = event.Records[0].s3.bucket.name;
  console.log("got src bucket name");
  // Object key may have spaces or unicode non-ASCII characters.
  var srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
  console.log("src key decoded");
  // Download the CSV file from S3, Extract&Load data into DynamoDB, and notify end users.
  async.waterfall([
    function downloadCSV(next) {
      // Download the Daily Sales Highlights CSV file from S3 into a buffer.
      s3.getObject({
          Bucket: srcBucket,
          Key: srcKey
        },
        next);
    },

    function parseCSV(response, next) {
      console.log(response.ContentType);

      var csvStream = AWS.util.buffer.toStream(response.Body);
      var csvJSON = [];

      var converter = new Converter({});
      //end_parsed will be emitted once parsing finished 
      converter.on("end_parsed", function(jsonArray) {
        console.log(jsonArray); //here is your result jsonarray 
        csvJSON = jsonArray;
        next(null, csvJSON);
      });
      //read CSV from stream 
      csvStream.pipe(converter);
    },
    function updateState(csvJSON, next) {
      //Update state in DynamoDB
      next(null, csvJSON);
    },
    function notifyEndUsers(csvJSON, next) {

      //Notify end users
      console.log("\n\nNotifying SMS end users...\n\n");
      console.log(dshSmsStr(csvJSON));
      console.log("\n\nNotifying email end users...\n\n");
      console.log(dshEmailStr(csvJSON));

      //email
      snsTopicEMAIL.publish({
        Message: dshEmailStr(csvJSON)
      }, function(err, data) {
        if (err) {
          console.log(err.stack);
          next(err);
        }
        console.log(data);
        next(null);
      });


      //SMS
      var datastr = dshSmsStr(csvJSON);
      var strlen = dshSmsStr(csvJSON).length;
      var ranscript = false;
      var completemsg1 = false;
      var completemsg2 = false;
      var completemsg3 = false;
      var completemsg4 = false;
      var completemsg5 = false;
      var completemsg6 = false;

      function callfirstmessage() {
        snsTopicSMS.publish({
          Message: dshSmsStr(csvJSON).substring(0, 150)
        }, function(err, data) {
          if (err) {
            console.log(err.stack);
            next(err);
          }
          console.log(data);
          next(null);
        });
        return true;
      }

      function callsecondmessage() {
        snsTopicSMS.publish({
          Message: dshSmsStr(csvJSON).substring(150, 300)
        }, function(err, data) {
          if (err) {
            console.log(err.stack);
            next(err);
          }
          console.log(data);
          next(null);
        });
        return true;
      }

      function callthirdmessage() {
        snsTopicSMS.publish({
          Message: dshSmsStr(csvJSON).substring(300, 450)
        }, function(err, data) {
          if (err) {
            console.log(err.stack);
            next(err);
          }
          console.log(data);
          next(null);
        });
        return true;
      }

      function callfourthmessage() {
        snsTopicSMS.publish({
          Message: dshSmsStr(csvJSON).substring(450, 600)
        }, function(err, data) {
          if (err) {
            console.log(err.stack);
            next(err);
          }
          console.log(data);
          next(null);
        });
        return true;
      }

      function callfifthmessage() {
        snsTopicSMS.publish({
          Message: dshSmsStr(csvJSON).substring(600, 750)
        }, function(err, data) {
          if (err) {
            console.log(err.stack);
            next(err);
          }
          console.log(data);
          next(null);
        });
        return true;
      }

      function one() {
        new Promises(function(resolve1, reject) {
          completemsg1 = callfirstmessage();
          if (completemsg1 === true) {
            resolve1(true);
            console.log('first success');
          } else {
            reject(false);
            console.log('first fail');
          }

        });
      }

      function two() {
        new Promises(function(resolve2, reject) {
          completemsg2 = callsecondmessage();
          if (completemsg2 === true) {
            resolve2(completemsg2);
            console.log('second success');
          } else {
            reject(false);
            console.log('second fail');
          }

        });
      }

      function three() {
        new Promises(function(resolve3, reject) {
          completemsg3 = callthirdmessage();
          if (completemsg3 === true) {
            resolve3(completemsg3);
            console.log('third success');
          } else {
            reject(false);
            console.log('third fail');
          }

        });
      }

      function four() {
        new Promises(function(resolve4, reject) {
          completemsg4 = callfourthmessage();
          if (completemsg4 === true) {
            resolve4(completemsg4);
            console.log('fourth success');
          } else {
            reject(false);
            console.log('fourth fail');
          }

        });
      }

      function five() {
        new Promises(function(resolve5, reject) {
          completemsg5 = callfifthmessage();
          if (completemsg5 === true) {
            resolve5(completemsg5);
            console.log('fifth success');
          } else {
            reject(false);
            console.log('fifth fail');
          }

        });
      }
      console.log("\n\n Begin SMS script. Data length :" + strlen + "...\n\n");
      if (strlen < 150) { //one message sent
        //Will complete later
        ranscript = true;
      } else if (strlen < 300) { //two messages sent
        //Will complete later
        ranscript = true;
      } else if (strlen < 450) { //three messages sent
        //Will complete later
        ranscript = true;
      } else if (strlen < 600) { //four messages sent
        one().then(function() {
            return two();
          })
          .then(function() {
            return three();
          })
          .then(function() {
            return four();
          })
          .then(function() {
            return five();
          });
        ranscript = true;
      } else if (strlen < 750) { //five messages sent
        //Will complete later
        ranscript = true;
      } else {
        console.log("\n\n The SMS mesages is too large to send to end users...\n\n");
      }
      if (ranscript === false) {
        console.log("\n\n SMS script did not run \n\n");
      } else if (ranscript === true) {
        console.log("\n\n SMS script successfully ran \n\n");
      }
    }
  ], function(err) {
    if (err) {
      console.error(
        'Unable to process due to an error: ' + err
      );
    } else {
      console.log(
        'Successfully processed'
      );
    }

    context.done();
  });

}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

第一个承诺的执行人(重新格式化):

var promise = new Promise(function(resolve, reject)
{ // do some async stuff
  callfirstmessage();
  if (success)
  { resolve(data);
  } else
  { reject(reason);
  }
});

不会异步解析或拒绝返回的promise。在解析/拒绝返回的promise之前,您需要从异步操作中获取回调。在伪代码中更像是:

var promise = new Promise(function(resolve, reject)
{ // do some async stuff
  callfirstmessage( successCallBack, failCallBack);
  function successCallBack( data)
  {  resolve(data);
  }
  function failCallBack( reason)
  {  reject(reason);
  }
});

实际上,您可能必须使用回调异步操作支持,然后根据位于请求或响应对象中的状态属性分析操作的成功或失败。