使用嵌套的async.forEachSeries和async.waterfall来控制Lambda Node.js代码的sorting

我有一个在Lambda中运行的Alexa技能的一部分,它将文本发送给玩家。 我使用async.waterfall来控制调用dynamodb表的顺序,以获得该播放器的正确ARN(将文本发送到哪里),然后通过AWS SNS发布SMS。 如果playerToReceive []中只有一个玩家,则可以使用。 不过,我需要它为多个玩家工作。 为了做到这一点,我embeddedasync.forEachSeries(也尝试forEach)内的async.waterfall,但我有callback结构错误。 我想我需要应用这个答案的逻辑,但是我对这个问题很陌生并且挣扎。

async.forEachSeries( playersToReceive, // array of items function(receivingPlayer, callback){ async.waterfall([ function (callback) { session.attributes.phoneKey = receivingPlayer; callback(null); }, function (callback) { playerStorage.loadPlayer(session, function (newLoadedPlayer) { if (newLoadedPlayer == 'playerNotFound' || newLoadedPlayer == 'errorLoadingPlayer') { problems = true; // set problems flag for later callback(null); } else { var ARNtoSend = newLoadedPlayer.data.TopicARN.S; callback(null, ARNtoSend); }; }) }, function (ARNtoSend, callback) { playerSMS.publishSMS(ARNtoSend, textToSend, function (success) { if (success == false) {problems = true}; // set problems flag for later callback(null); }) } ], function (err, result) { if (err) console.log(err, "SMS text had a problem sending."); if (!err) console.log(null, "SMS text was successfully sent."); }); callback(); }, function(err){ // All tasks are now complete speechText = 'OK, text sent.'; if (problems == true) { speechText += ' . But there was a problem sending it to some players.' } response.tell(speechText); } ); 

我想通了 – 外部callback需要进入瀑布的closuresfunction。 随着这一变化,它的工作原理:

  async.forEachSeries( playersToReceive, // array of items function(receivingPlayer, callback){ async.waterfall([ function (callback) { session.attributes.phoneKey = receivingPlayer; callback(null); }, function (callback) { playerStorage.loadPlayer(session, function (newLoadedPlayer) { if (newLoadedPlayer == 'playerNotFound' || newLoadedPlayer == 'errorLoadingPlayer') { problems = true; // set problems flag for later callback(null); } else { var ARNtoSend = newLoadedPlayer.data.TopicARN.S; callback(null, ARNtoSend); }; }) }, function (ARNtoSend, callback) { playerSMS.publishSMS(ARNtoSend, textToSend, function (success) { if (success == false) {problems = true}; // set problems flag for later callback(null); }) } ], function (err, result) { if (err) console.log(err, "SMS text had a problem sending."); if (!err) console.log(null, "SMS text was successfully sent."); callback(); }); }, function(err){ // All tasks are now complete speechText = 'OK, text sent.'; if (problems == true) { speechText += ' . But there was a problem sending it to some players.' } response.tell(speechText); } );